-1

我有一个需要在 C#/XAML 应用程序的后台线程上运行的活动,所以我这样做:

Task.Factory.StartNew(() => ImportFile());

我将 Task 值返回到另一段代码,然后在基于线程的工作完成后需要采取行动。代码如下所示:

Action<Task> finalise = async delegate { await FinishImport(dbList); };
dbList.ImportFileAsync().ContinueWith(finalise);

FinishImport但是,当我运行代码时,在后台线程完成之前正在执行调试语句。

我在这里有什么误解?我认为的重点ContinueWith是它会在目标任务完成后执行延续代码。

4

2 回答 2

1

您应该使用Task.Run而不是Task.Factory.StartNewasync代码中。Task.Run理解async方法,而StartNew将返回Task仅表示该async方法开头的 a。

作为旁注,通常最好不要Task.Run隐藏在库方法中。

而且,它awaitContinueWith. async方法应以“异步”结尾。

因此,应用这些准则会使您的代码看起来像:

await Task.Run(() => dbList.ImportFileAsync());
await FinishImportAsync(dbList);
于 2013-06-30T17:22:00.637 回答
0

做什么ImportFileAsync()

finalise将在 will 的线程ImportFileAsync()结束后运行

如果 ImportFileAsync(){ Task.Factory.StartNew(() => ImportFile());}

然后ImportFileAsync将调用一个新线程ImportFile()然后退出它不会等待ImportFile() 完成

你想做

Task.Factory.StartNew(() => dbList.ImportFile()).ContinueWith(finalise);

于 2013-06-30T12:48:56.547 回答