c# – Await停止执行线程,永远不会继续
我有以下内容:
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. TaskEx.Run(async delegate { // ... _updateAvailable = await _updateManager.SearchForUpdatesAsync(); MessageBox.Show("Test"); }); 我遇到的问题是它执行_updateAvailable = await _updateManager.SearchForUpdatesAsync();然后它不会继续该线程,它只是停止,好像在该调用之后没有任何内容. Visual Studio也会在一段时间后告诉我:Thread …退出代码259,所以似乎还有一些东西还活着. 我通过它调试来搜索可能被吞下的任何异常,但没有,一切正常并且它执行return语句. 在此先感谢,这实际上我只能说,我没有更多的信息,我尽可能地感谢任何提示和帮助. 解决方法
您遇到的主要问题是您在TaskEx.Run()中不必要地包装您的方法,并且您可能正在某处遇到死锁.
您的方法签名目前是: public async Task<bool> SearchForUpdatesAsync() 这意味着以下内容:
等待TaskEx.Run()是不必要的,因为这说运行此方法,然后在值可用之后才返回.这很可能导致同步问题.删除此构造将使您的方法正常工作,但是您会注意到现在您没有理由甚至包括异步运算符或任务< T>部分因为该方法实际上是同步的.通常,如果您要调用等待它们的方法,那么您将只在方法签名上使用异步标识符. 相反,你有两个选择. >每当您想要调用SearchForUpdates()时,您可以将其包装在Task< bool> .Run()中以异步方式运行它(或者等效的Bcl) 关于使用async-await模式,我认为这是一篇很好的文章,用于确保您遵循最佳实践:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |