任务块我的主线程中的C#(异步/等待)循环?

任务块我的主线程中的C#(异步/等待)循环?,c#,multithreading,asynchronous,async-await,C#,Multithreading,Asynchronous,Async Await,我是异步新手,正在等待,所以我只是想弄清楚为什么我的任务“CallConnection”会阻止我的主UI线程。。。你们能帮帮我吗 哦,还有一个连接: PortalODataContext portalContext = await this.CallConnection(connectionOpen); private Task getConnection(连接) { 返回Task.Factory.StartNew(()=> { 尝试 { var context=con

我是异步新手,正在等待,所以我只是想弄清楚为什么我的任务“CallConnection”会阻止我的主UI线程。。。你们能帮帮我吗

哦,还有一个连接:

PortalODataContext portalContext = await this.CallConnection(connectionOpen);
private Task getConnection(连接)
{            
返回Task.Factory.StartNew(()=>
{
尝试
{
var context=connection.ConnectToPortal();
connection.ListTemplateLib=this.ShellModel.ConnectionManager.GetTemplateLibrary(连接);
connection.ListTemplateGrp=this.ShellModel.ConnectionManager.GetTemplateGroups(connection,connection.TemplateLibraryId);
connection.ListTemplates=this.ShellModel.ConnectionManager.GetTemplates(connection,connection.TemplateGroupId);
返回上下文;
}
捕获(例外)
{
投掷;
}
});

提前感谢

因为
线程。睡眠

async/await将方法一分为二,在
await
之前和之后。在前半部分中有一个
线程。Sleep
,导致调用线程冻结

使用:

专用异步任务调用连接(连接)
{
bool cancel=false;
connection.Connected=true;
var task=getConnection(连接);
而(!cancel&&!task.IsCompleted)
{
等待任务。延迟(100);
if(连接断开)
{
取消=真;
}
}
返回等待任务;
}

我不完全确定您在这里想要实现什么。

因为
线程。睡眠

async/await将方法一分为二,在
await
之前和之后。在前半部分中有一个
线程。Sleep
,导致调用线程冻结

使用:

专用异步任务调用连接(连接)
{
bool cancel=false;
connection.Connected=true;
var task=getConnection(连接);
而(!cancel&&!task.IsCompleted)
{
等待任务。延迟(100);
if(连接断开)
{
取消=真;
}
}
返回等待任务;
}

我不完全确定您在这里想要实现什么。

当您调用异步任务时,您必须等待结果

异步的好处是可以在一个方法中运行两个进程,但只能在该方法中运行。 在离开该块之前,必须再次统一两个进程。这样可以更容易地运行不同的进程,而不必为涉及的对象写入委托和锁

看看异步方法中发生了什么。这里有一个图表可以帮助您澄清流程

在您的代码中,您不需要Threed.Sleep。在getConnection返回某些内容之前,CallConnection方法不会返回任何内容。然后您可以在主线程中继续


希望对您有所帮助。

当您调用异步任务时,您必须等待结果

异步的好处是可以在一个方法中运行两个进程,但只能在该方法中运行。 在离开该块之前,必须再次统一两个进程。这样可以更容易地运行不同的进程,而不必为涉及的对象写入委托和锁

看看异步方法中发生了什么。这里有一个图表可以帮助您澄清流程

在您的代码中,您不需要Threed.Sleep。在getConnection返回某些内容之前,CallConnection方法不会返回任何内容。然后您可以在主线程中继续


希望这能对您有所帮助。

那么您想知道主线程被阻塞的原因吗?是的,我想不出来。看起来您的实际IO不是天生异步的,所以您只是在异步方法上创建同步。您真的不应该这样做。如果工作天生是同步的,您应该同步进行。如果一些更高级别的方法需要,比如说,将工作转移到另一个线程以保持UI线程的响应性,他们可以这样做。所以你想知道主线程被阻塞的原因吗?是的,我想不出来。看起来你的实际IO不是天生异步的,所以你只是在异步方法上创建同步。你真的不应该这样做这就是。如果工作本质上是同步的,那么你应该同步进行。如果某个更高级别的方法需要,比如说,将工作转移到另一个线程以保持UI线程的响应性,那么他们可以这样做。没错。老实说,所有的方法对我来说都很奇怪:)可能是因为它只是一个摘录。我正在尝试取消该任务,因为我需要依依我的断开Button@Cedric调查。但必须是合作的。没错。老实说,所有的方法对我来说都很奇怪:)可能是因为它只是一个摘录。当我点击断开连接时,我正试图取消任务Button@Cedric调查一下,但必须是合作的。
PortalODataContext portalContext = await this.CallConnection(connectionOpen);
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;
            }
       });
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;
}