繁体   English   中英

异步运行同步方法

[英]Running a synchronous method asynchronously

我正在尝试异步运行同步方法,以便可以用其进度更新UI。 我必须对几个不同的数据运行相同的同步方法,但是一次只能有一个这种方法的实例。

这是我尝试过的方法,它与我的程序不完全一样,但我对其进行了简化以最大程度地减少混乱。

class Program
{
    static int[] data = new int[10]
    {
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    };

    static void Main(string[] args)
    {
        Method(0);
    }

    static void Method(int parameter)
    {
        if (parameter < data.Length)
        {
            Worker worker = new Worker();
            worker.OnProgressChange += delegate
            {
                // Update UI
            };
            worker.OnWorkComplete += delegate
            {
                Method(parameter++);
            };
            worker.DoWork();
        }
    }
}

class Worker
{
    public event EventHandler OnProgressChange;
    public event EventHandler OnWorkComplete;

    public Worker() { }

    public void DoWork() { }
}

我不确定该如何攻击。 如果我对问题的解释不够充分,请告诉我。

.NET已经为您做到了: BackgroundWorker类

基本上,您需要做的就是更改Method参数以使其与BackgroundWorker (object sender, DoWorkEventArgs e) RunWorkAsync (object sender, DoWorkEventArgs e)并调用RunWorkAsync

好的,我找到了解决方案! 答案将不适用于我上面介绍的抽象方案,但是想法是相同的。

    private bool flag = false;

    private void CheckCompletion()
    {
        // Do stuff

        ConvertFiles();
        while (!flag)
            Application.DoEvents();

        // Do more stuff
    }

    private void ConvertFiles()
    {
        UpdateStatus("Converting...", true);
        Task.Factory.StartNew(() =>
        {
            using (Engine engine = new Engine())
            {
                for (int i = 0; i < entries.Count; i++)
                {
                    MediaFile inputFile = new MediaFile(entries[i].FilePath);
                    MediaFile outputFile = new MediaFile(entries[i].FilePath.Replace(".aac", ".mp3"));
                    engine.ConvertProgressEvent += (obj, args) =>
                    {
                        int value = (int)Math.Round(args.ProcessedDuration.TotalSeconds /
                            args.TotalDuration.TotalSeconds);
                        Invoke(new Action(delegate { entries[i].ProgressBarEx.Value = value; }));
                    };
                    engine.Convert(inputFile, outputFile);
                }
            }
            flag = true;
        });
    }

如果需要异步运行同步方法,请使用任务并行库。 如果您需要运行该异步运行的同步任务的多个实例,但一次只能运行一个,则在该任务内放置一个for loop ,并在所有任务完成时让bool变量告知应用程序。 这是while(!flag) Application.DoEvents(); 那是纯魔术。

如果我所说的话太混乱了,我感到抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM