【发布时间】:2015-04-02 02:33:56
【问题描述】:
我是 C# 的新手,来自沉重的 java 背景,但仍在试图弄清楚 await 和 async 究竟是如何工作的,这让我很困惑:
假设我有一个这样的函数(下面的黑客代码仅用于实验):
public static bool CheckInternetConnection()
{
Task<bool> result = CheckInternetConnectionAsync();
return result.Result;
}
public async static Task<bool> CheckInternetConnectionAsync()
{
if (NetworkInterface.GetIsNetworkAvailable())
{
SomeClass details = await ReturnARunningTask();
return details.IsSuccessful;
}
return false;
}
public Task<SomeClass> ReturnARunningTask()
{
return Task.Run(() => checkInternet());
}
在主执行线程中,如果我这样调用:
CheckInternetConnection();
它将无限期地阻塞,我的假设是控制将 CheckInternetConnectionAsync() 留在“await”关键字并阻塞“.Result”。当 await 恢复时,主线程已经被阻塞并保持阻塞状态
我假设的原因是我可以看到任务完成并返回,但是await之后的代码永远不会执行
但是,如果我这样做:
bool result = Task.Run(() => CheckInternetConnection()).Result;
然后执行await语句后的代码,主线程继续执行
我的预期是它也会阻塞,因为主线程会在中间任务上被阻塞。中间任务会在 .Result 上被阻塞
所以..有什么不同?在这种情况下,await之后的代码会被执行吗?
【问题讨论】:
-
这是什么类型的应用程序?控制台,wpf?
-
它是一个在 Android 上运行的 xamarin 应用程序,用 C# 编写...
标签: c# .net async-await task c#-5.0