我有以下内容:
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 -statement。这就是我不了解的地方,我从没看到MessageBox和/或没有代码超出执行范围。在我与一些朋友交谈后,他们确认不应该这样。实施异步等待时,我是否犯了一个可怕的错误?
预先感谢,实际上我只能说这件事,我没有更多的信息,我尽可能地感谢任何提示和帮助。
您遇到的主要问题是您不必要地包装了方法,TaskEx.Run()
并且可能在某处遇到了死锁。
您的方法签名当前为:
public async Task<bool> SearchForUpdatesAsync()
这意味着:
async
->实际上不执行任何操作,但是提供了await
可以在此方法中调用的“提示”,并且该方法可用作可运行的Task。
Task
->此方法返回可在线程池上异步运行的可运行任务
<bool>
->此方法实际上在等待时返回bool。
该await TaskEx.Run()
是不必要的,因为这表示,运行该方法,然后不返回,直到之后的值是可用的。这很可能导致同步问题。删除此构造将使您的方法正常工作,但是您会注意到,由于该方法实际上实际上是同步的,因此您现在甚至没有理由甚至包括async
运算符或该Task<T>
部分。通常,只有在async
要调用方法时,才在方法签名上使用标识符await
。
相反,您有两个选择。
SearchForUpdates()
都可以将其包装在中Task<bool>.Run()
以异步运行(或等效的Bcl)BackgroundWorker
并在其中调用此方法。关于使用async-await模式,我认为这是一篇很棒的文章,可用来确保您遵循最佳实践:https : //msdn.microsoft.com/zh-cn/magazine/jj991977.aspx
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句