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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
