解决此问题的一种方法是使用 async 和 await,如下所示:
public void Main()
{
AsyncExample();
Console.WriteLine("prints first");
}
public async Task AsyncExample()
{
Task<string> executesSeparately = ExecutesSeparately();
string result = await longRunningTask;
Console.WriteLine(result);
}
public async Task<string> ExecutesSeparately()
{
await Task.Delay(2000);
return "prints second";
}
您将在输出窗口中看到,Console.WriteLine("prints first") 在 AsyncExample() 完成并写入一行之前执行。
解决此问题的另一种方法是使用 BackgroundWorker。
public string DoSomethingQuick()
{
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
DoSomethingThatTakes10Minutes();
};
backgroundWorker.RunWorkerAsync();
return "Process Started";
}
请注意,在很多情况下,单独的线程将无法更改从主线程创建的非静态对象,因此您需要使用 Dispatcher 或在调用中包含 UI 线程逻辑到 BackgroundWorker.ReportProgress(),它会自动在 UI 线程上工作。看起来更像这样:
var backgroundWorker = new BackgroundWorker() { WorkerSupportsCancellation = true };
backgroundWorker.ReportProgress += delegate(object s, ProgressChangedEventArgs e)
{
DoSomethingThatTakes10MinutesAndExecutedOnUiThread();
}
backgroundWorker.DoWork += delegate(object s, DoWorkEventArgs e)
{
backgroundWorker.ReportProgress(0); // the progress value is irrelevant
};