【发布时间】:2014-08-10 04:57:07
【问题描述】:
private async Task<PortalODataContext> CallConnection(Connection connection)
{
bool cancel = false;
connection.Connected = true;
var task = getConnection(connection);
while (!cancel && !task.IsCompleted)
{
Thread.Sleep(100);
if (connection.Disconected)
{
cancel = true;
}
}
return await task;
}
这是我在主线程上调用的函数,就像这样:
PortalODataContext portalContext = await this.CallConnection(connectionOpen);
我是异步和等待的新手,所以我只是想弄清楚为什么我的任务“CallConnection”阻塞了我的主 UI 线程......你们能帮帮我吗?
哦,还有 GetConnection :
private Task<PortalODataContext> getConnection(Connection connection)
{
return Task.Factory.StartNew(() =>
{
try
{
var context = connection.ConnectToPortal();
connection.ListTemplateLib = this.ShellModel.ConnectionManager.GetTemplateLibrarys(connection);
connection.ListTemplateGrp = this.ShellModel.ConnectionManager.GetTemplateGroups(connection, connection.TemplateLibraryId);
connection.ListTemplates = this.ShellModel.ConnectionManager.GetTemplates(connection, connection.TemplateGroupId);
return context;
}
catch (Exception)
{
throw;
}
});
提前致谢
【问题讨论】:
-
所以你想知道为什么你的主线程被阻塞了?
-
是的,我想不通
-
看起来你的实际 IO 本质上不是异步的,所以你只是在异步方法上创建同步。你真的不应该这样做。如果工作本质上是同步的,那么您应该同步进行。如果某个更高级别的方法需要,例如,将工作卸载到另一个线程以保持 UI 线程响应,他们可以这样做。
标签: c# multithreading asynchronous async-await