【发布时间】:2015-07-25 12:24:23
【问题描述】:
我对 C# 中的异步编程有点陌生,正在努力应对一个小而令人沮丧的挑战。
我有一个运行良好的 ASP.Net MVC WEB API。另一方面,我创建了这个 WEB API 客户端方法:
public async Task<DTOVArt> GetVArtFormArt(DTOArt art)
{
using (var client = GetHttpClient())
{
var response = await client.GetAsync("api/APIVArt/Get/" + art.ART_ID);
if (!response.IsSuccessStatusCode) return null;
var arts = await response.Content.ReadAsAsync<DTOVArt>();
return arts;
}
}
这似乎工作得很好......
这个方法是从 WPF 视图模型中调用的,这就是我的问题所在..
private DTOVObs TransFormAaretsGang(DTOAaretsGang aaretsGang)
{
var dtovObs = new DTOVObs();
using (var artservice = new ArtService())
{
artservice.GetVArtFormArt(new DTOArt() {ART_ID = aaretsGang.ART_ID}).ContinueWith(t =>
{
dtovObs.Familie_id = t.Result.Familie_id;
dtovObs.Gruppe_id = t.Result.Gruppe_id;
dtovObs.ART_ID = t.Result.ART_ID;
if (aaretsGang.Dato != null) dtovObs.Aarstal = aaretsGang.Dato.Value.Year;
return dtovObs;
});
}
return dtovObs;
}
问题是最后一个方法在到达 ContinueWith 语句块之前执行 return 语句,这实际上设置了应该返回的类中的值。
任何尝试执行任何类型的 Wait() 或使用 .Result 而不是 ContinueWith 只会阻止一切。
如果我在 ContinueWith 块内执行 return,C# 编译器会说该方法缺少 return 语句,这是真的。
【问题讨论】:
-
在不使用
await关键字的情况下调用async方法很危险。如果您不在Task上调用Result,将在其他地方执行,如果您调用Result,您的应用程序通常会死锁。最简单的解决方案是只使用await,并将调用方法重构为async,并同样使用await,直到您使用事件处理程序。
标签: c# asynchronous