【发布时间】:2014-09-23 14:19:58
【问题描述】:
在控制台应用程序中,我按如下方式使用 async-await:
static void Main(string[] args)
{
// Task<Model>
var taskGetModel = Testcases.GetModel(22);
taskGetModel.Wait();
// Task without TResult
var taskSaveModel = Testcases.SaveModel(taskGetModel.Result);
taskSaveModel.Wait();
}
public async static Task<Model> GetModel(int number)
{
var baseData = await serviceagent.GetBaseData();
var model = await serviceagent.GetModel(baseData, number);
model.BaseData = baseData;
return model;
}
public static async Task SaveModel(Model model)
{
await serviceagent.SaveModel(model);
}
// as for the service methods:
public async Task SaveModel(Model model)
{
// the method `.ToCommunication` has the signature:
// public async Task<CommunicationModel> ToCommunication
var commodel = await new Mapper().ToCommunication(model);
// Proxy is the interface to the servce (ChannelFactory etc.)
// the method `.Save` has the signature:
// public async Task Save(CommunicationModel model)
await Proxy.Save(commodel);
}
public async Task<Model> GetModel(BaseData baseData, int number)
{
// NOT a task: CommunicationModel GetCommunicationModel
var commodel = Proxy.GetCommunicationModel(baseData, number);
// signature with Task: public async Task<Model> ToModel
return await new Mapper().ToModel(baseData, commodel);
}
在静态 main 中,Task<TResult> 给出了很好的结果,函数 GetModel 立即返回 Task,我可以等待它的结果完成。
为什么SaveModel中的Task没有立即返回?SaveModel 中的 await 已经在该方法中等待。
是因为没有TResult吗?
【问题讨论】:
-
那么您的
SaveModel方法是做什么的?它真的是异步的吗?如果您能提供一个简短但完整的程序来演示该问题,那将非常有帮助。请注意,编写一个只有await是最后一件事的异步方法很少有用 - 它只是将一个异步(可能)操作包装在另一个中。 -
Task与Task<TResult>之间没有区别。SaveModel和GetBaseData的实现方式很可能有所不同。 -
你不应该同步等待这样的异步方法。如果你有一个消息循环,你就会死锁你的程序,即使你没有,你也完全违背了使用异步方法的目的。
-
一个真正的等待方法只是返回
Task或Task<T>(或其他等待类型),它不能保证它实际上是是 i> 完全异步(或者完全异步,它可以返回Task和IsCompleted状态true)。如果没有看到Proxy.Save做什么、ToCommunication做什么或Mapper()是什么,就无法确定。 -
@TimS。您可以编写一个并行工作的同步程序;如果需要的话,有很多方法可以做到这一点。在这里,考虑到底层工作主要是异步 IO,我想说整个程序应该是异步的,而不是同步的,但是做一半和有就是给你两全其美。程序应该是其中之一;两者都可以工作。
标签: c# async-await