c# (async / await)循环在任务块我的主线程
本文关键字:任务 我的 线程 循环 async await | 更新日期: 2023-09-27 18:09:16
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;
}
});
Thanks in advance
Thread.Sleep
async/await将你的方法分成两个,在await
之前和之后。在前半部分,你有一个Thread.Sleep
,导致调用线程冻结。
使用:
private async Task<PortalODataContext> CallConnection(Connection connection)
{
bool cancel = false;
connection.Connected = true;
var task = getConnection(connection);
while (!cancel && !task.IsCompleted)
{
await Task.Delay(100);
if (connection.Disconected)
{
cancel = true;
}
}
return await task;
}
我不太清楚你到底想达到什么目的。
调用异步任务时,必须等待结果。
异步的好处是你可以在一个方法中运行两个进程,但只能在该方法中运行。在离开该块之前,两个进程必须再次统一。这使您更容易运行不同的进程,而不必为所涉及的对象编写委托和锁。
请看这里,看看异步方法中发生了什么。这里有一个图表可以帮助你澄清流程。
在你的代码中你不需要Threed.Sleep。在getConnection返回一些东西之前,CallConnection方法不会返回任何东西。然后你可以继续你的主线程。
希望对你有帮助。