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 …退出代码259,所以似乎还有一些东西还活着.
我通过它调试来搜索可能被吞下的任何异常,但没有,一切正常并且它执行return语句.
这就是我不明白的地方,我从未看到MessageBox和/或没有代码超出此行的执行.
在我和一些朋友交谈后,他们确认不应该这样做.在实现async-await时我犯了一个可怕的错误吗?
在此先感谢,这实际上我只能说,我没有更多的信息,我尽可能地感谢任何提示和帮助.
解决方法
您的方法签名目前是:
public async Task<bool> SearchForUpdatesAsync()
这意味着以下内容:
async
–> Doesn’t actually do anything,but provides a “heads up” thatawait
might be called within this method and that this method can be used as a runnable Task.
Task
–> This method returns a runnable task that can be run asynchronously on the threadpool
<bool>
–> This method actually returns bool when awaited.
等待TaskEx.Run()是不必要的,因为这说运行此方法,然后在值可用之后才返回.这很可能导致同步问题.删除此构造将使您的方法正常工作,但是您会注意到现在您没有理由甚至包括异步运算符或任务< T>部分因为该方法实际上是同步的.通常,如果您要调用等待它们的方法,那么您将只在方法签名上使用异步标识符.
相反,你有两个选择.
>每当您想要调用SearchForUpdates()时,您可以将其包装在Task< bool> .Run()中以异步方式运行它(或者等效的Bcl)
>由于您使用的是WinForms,因此最好使用BackgroundWorker
并在其中调用此方法.
关于使用async-await模式,我认为这是一篇很好的文章,用于确保您遵循最佳实践:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx