无法让C#任务执行流程正常工作

时间:2013-06-30 12:13:00

标签: c# task-parallel-library

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您应该在Task.Run代码中使用Task.Factory.StartNew而不是asyncTask.Run了解async方法,而StartNew将返回仅代表Task方法开头的async

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

此外,使用await比使用ContinueWith要容易得多。 async方法应以“异步”结束。

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

await Task.Run(() => dbList.ImportFileAsync());
await FinishImportAsync(dbList);

答案 1 :(得分:0)

ImportFileAsync()做了什么?

finalise将在ImportFileAsync()的帖子结束后运行

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

然后ImportFileAsync将调用ImportFile()的新主题,然后退出它将不会等待ImportFile() 完成

你想做什么

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