Task.Result等待而不是继续异步操作

时间:2014-02-27 12:59:13

标签: c# .net wcf asynchronous task-parallel-library

我有一个应该异步运行但同步运行的任务。

我创建了一个任务:

 var task = Task<int>.Factory.FromAsync(proxy.BeginSaveImage(sp, new AsyncCallback(CompleteSave), state), proxy.EndSaveImage);

 int res =   task.Result;

Task调用异步WCF服务。 WCF服务功能:

 public IAsyncResult BeginSaveImage(statePackage sp, AsyncCallback callback, object state)
    {
        gStatePackage = sp;

        // Create a task to do the work
        var task = Task<int>.Factory.StartNew(this.SaveImage, state);

        return task.ContinueWith(res => callback(task));
    }

我在循环中运行任务。

我的问题是,当我运行它时,它不会并行运行,每次调用task.Results都会等待任务完成后再继续。

当我将任务代码放入函数SaveImageProcedure并在循环内调用它时:

Task.Factory.StartNew(() =>
 {
    SaveImageProcedure(sp);
 });

它以异步方式运行。我不想用另一个异步包装器包装异步调用。为什么使用task.Result的调用不是异步运行的?如何在没有包装的情况下将其更改为运行async,就像运行异步一样(或者如果它运行异步,请不要等待结果并继续操作) ?

我不需要返回任务值,并且不介意获取它,但是代码继续在循环中运行下一次迭代而不等待结果继续。

2 个答案:

答案 0 :(得分:2)

通过阅读Result字段,您正在等待结果可用。 尝试使用Continue评估结果,或使用await

我希望看起来像(伪代码):

var task = Task<int>...
task.ContinueWith(result => {
    if (result != expected) throw new Exception("...");
});

基本上,如果您正在执行一项任务而您必须获得结果,那么同步执行此部分工作流程。 Taskasync只允许你在等待时做其他事情,他们没有做任何魔法。

答案 1 :(得分:0)

我建议您阅读我的async introMSDN article on best practices。特别是,请使用await代替ContinueWithResult

在服务器端,将工作包装在StartNew中是没有意义的。如果只有同步工作,它应该只是同步执行。