C#(async/await)循环在任务块我的主线程?

C1r*_*dec -1 c# multithreading asynchronous async-await

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;
    }
Run Code Online (Sandbox Code Playgroud)

这是我在主线程上调用的函数,如下所示:

PortalODataContext portalContext = await this.CallConnection(connectionOpen);
Run Code Online (Sandbox Code Playgroud)

我是async的新手,等待所以我只想弄清楚为什么我的任务"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;
            }
       });
Run Code Online (Sandbox Code Playgroud)

提前致谢

vto*_*ola 5

Becasue 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;
}
Run Code Online (Sandbox Code Playgroud)

我不完全确定你在这里想要实现的目标.