2014-02-27 50 views
-1

我有一个任务应该异步运行,但同步运行。Task.Result等待而不是继续异步操作

我创建了一个任务:

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

int res = task.Result; 

任务调用异步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的调用不会异步运行,我如何将其更改为运行异步,而不像我一样运行异步(或者运行异步,不等待结果并继续运行),而是将其包装为运行异步?

我不需要任务返回值,也不介意得到它,但是代码会继续为循环中的下一个迭代运行,而无需等待结果继续。

回答

2

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

我所期待的东西,看起来像(伪代码):

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

从本质上讲,如果你正在做一个任务,你必须得到结果,你同步做这部分工作流程。 Taskasync只允许你在等待时做其他事情,他们不会做任何魔术。

+0

嗨伊恩,如何使用继续,请你提供一个例子,所以我可以在实践中尝试它。谢谢 –

+0

@IdanShechter文档告诉你你需要的一切http://msdn.microsoft.com/en-us/library/ee372288%28v=vs.110%29.aspx Google搜索查询是'c#continuation'。 – Gusdor

+0

非常好,非常感谢。 –

0

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

在服务器端,StartNew内部没有任何意义。如果它只有同步工作,它应该只是同步执行。