【发布时间】:2015-05-29 12:43:07
【问题描述】:
我有以下:
public async Task<bool> SearchForUpdatesAsync()
{
return await TaskEx.Run(() =>
{
if (!ConnectionChecker.IsConnectionAvailable())
return false;
// Check for SSL and ignore it
ServicePointManager.ServerCertificateValidationCallback += delegate { return (true); };
var configurations = UpdateConfiguration.Download(UpdateConfigurationFileUri, Proxy);
var result = new UpdateResult(configurations, CurrentVersion,
IncludeAlpha, IncludeBeta);
if (!result.UpdatesFound)
return false;
_updateConfigurations = result.NewestConfigurations;
double updatePackageSize = 0;
foreach (var updateConfiguration in _updateConfigurations)
{
var newPackageSize = GetUpdatePackageSize(updateConfiguration.UpdatePackageUri);
if (newPackageSize == null)
throw new SizeCalculationException(_lp.PackageSizeCalculationExceptionText);
updatePackageSize += newPackageSize.Value;
_packageOperations.Add(new UpdateVersion(updateConfiguration.LiteralVersion),
updateConfiguration.Operations);
}
TotalSize = updatePackageSize;
return true;
});
}
如您所见,我使用的是 Microsoft.Bcl。 现在在我的另一堂课中,我用普通的 void 编写了这段代码:
TaskEx.Run(async delegate
{
// ...
_updateAvailable = await _updateManager.SearchForUpdatesAsync();
MessageBox.Show("Test");
});
我遇到的问题是它执行_updateAvailable = await _updateManager.SearchForUpdatesAsync(); 然后它没有继续线程,它只是停止,好像在那个调用之后什么都没有。过了一会儿,Visual Studio 也会告诉我这个:Thread ... exited with code 259,所以有些东西似乎还活着。
我通过它进行调试以搜索任何可能被吞下的异常,但什么都没有,一切正常,它执行 return 语句。 这就是我不明白的,我从来没有看到 MessageBox 和/或没有执行此行之外的代码。 在我和一些朋友交谈后,他们确认这不应该。我在实现 async-await 时犯了一个可怕的错误吗?
在此先感谢,实际上我只能说这些了,我没有更多信息,我希望尽可能提供任何提示和帮助。
【问题讨论】:
-
TaskEx 的意义何在?只需等待您的方法,您无需创建另一个仅再次同步调用该方法的任务
-
@MatthewFrontino 你的意思是上面第二个代码部分的TaskEx.Run?
-
是的,你有一个等待任务的方法,它等待一个方法。你需要那么多层吗?
-
@MatthewFrontino 我想是的,如果没有异步修饰符,我不能等待该方法,或者我应该在“void”前面写那个修饰符来标记整个方法?还是根本不需要等待?那是我还没有理解的另一点,这是否意味着我的异步方法在运行其中的任务时已经在等待内容?这意味着我应该将类型从“Task
”更改为“bool”,对吧? -
您是否尝试调用 Result 或使用 continue 方法
标签: c# winforms asynchronous async-await