我有一个应该异步运行但同步运行的任务。
我创建了一个任务:
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,就像运行异步一样(或者如果它运行异步,请不要等待结果并继续操作) ?
我不需要返回任务值,并且不介意获取它,但是代码继续在循环中运行下一次迭代而不等待结果继续。
答案 0 :(得分:2)
通过阅读Result
字段,您正在等待结果可用。
尝试使用Continue
评估结果,或使用await
我希望看起来像(伪代码):
var task = Task<int>...
task.ContinueWith(result => {
if (result != expected) throw new Exception("...");
});
基本上,如果您正在执行一项任务而您必须获得结果,那么将同步执行此部分工作流程。 Task
和async
只允许你在等待时做其他事情,他们没有做任何魔法。
答案 1 :(得分:0)
我建议您阅读我的async
intro和MSDN article on best practices。特别是,请使用await
代替ContinueWith
或Result
。
在服务器端,将工作包装在StartNew
中是没有意义的。如果只有同步工作,它应该只是同步执行。