[英]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.