C# 异步运行同步方法

C# 异步运行同步方法,c#,C#,我正在尝试异步运行一个同步方法,以便可以用它的进度更新UI。我必须用几个不同的数据段运行同一个同步方法,但一次只能有一个该方法的实例 这就是我尝试过的,这并不完全是我的程序的样子,但我已经对它进行了简化,以尽量减少混乱 class Program { static int[] data = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; static void Main(string[] args)

我正在尝试异步运行一个同步方法,以便可以用它的进度更新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() { }
}
类程序
{
静态整数[]数据=新整数[10]
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
静态void Main(字符串[]参数)
{
方法(0);
}
静态无效方法(int参数)
{
if(参数<数据长度)
{
工人=新工人();
worker.OnProgressChange+=委托
{
//更新用户界面
};
worker.OnWorkComplete+=委托
{
方法(参数++);
};
工人。道工();
}
}
}
班主任
{
公共事件事件处理程序OnProgressChange;
公共事件事件处理程序OnWorkComplete;
公职人员(){}
public void DoWork(){}
}

我不知道如何攻击它。如果我没有很好地解释这个问题,请告诉我。

.NET已经为您做了:


基本上,您所需要做的就是更改方法参数以限制BackgroundWorker
(对象发送器,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;
        });
    }
private bool标志=false;
私有无效检查完成()
{
//做事
转换文件();
while(!flag)
Application.DoEvents();
//多做事
}
私有文件()
{
UpdateStatus(“转换…”,真);
Task.Factory.StartNew(()=>
{
使用(发动机=新发动机())
{
for(int i=0;i
{
int值=(int)Math.Round(args.ProcessedDuration.TotalSeconds/
args.TotalDuration.TotalSeconds);
调用(新操作(委托{entries[i].ProgressBarEx.Value=Value;}));
};
转换(输入文件,输出文件);
}
}
flag=true;
});
}
如果需要异步运行同步方法,请使用任务并行库。如果您需要运行该异步运行的同步任务的多个实例,但一次只运行一个实例,请在该任务内放置一个
for循环
,并使用
bool
变量告知应用程序所有任务何时完成。它是while(!flag)应用程序.DoEvents()的


很抱歉,如果我说的任何内容太让人困惑。

包含代码示例(Fibonacci更好:)谢谢,但我知道如何异步运行同步方法。我需要做的是异步多次同步运行同步方法。哈哈哈,如果你明白我的意思的话。这看起来不是一个好方法。您有一个紧凑的
while
循环,它将不断地获得时间片,以向系统屈服。NET提供了更好的内置方法来解决这个问题。@mbeckish我不能说这是一个好方法。但这是我能想出的唯一办法。如果你有更好的主意,请告诉我!我问这个问题的原因不仅仅是为了找到一种方法,而是为了确保我实施的方法是一种好方法。我不理解你的问题,但我认为你的回答说明了你正在努力实现的目标。您希望执行一些繁重的处理(转换文件集合),这将需要一些时间才能完成。您希望应用程序的执行线程被暂停,直到文件处理完成,但希望Windows能够响应。是这样吗?@mbeckish我希望UI线程处于活动状态且不冻结。考虑到这一点,我试图转换一个文件列表,但一次只能转换一个文件。这就是我想做的。