相关疑难解决方法(0)

如果async-await没有创建任何其他线程,那么它如何使应用程序响应?

一次又一次,我看到它说使用async- await不会创建任何额外的线程.这没有任何意义,因为计算机一次看起来只做一件事以上的唯一方法就是

  • 实际上一次做多件事(并行执行,使用多个处理器)
  • 通过调度任务并在它们之间切换来模拟它(做一点A,一点点B,一点A,等等)

因此,如果async- await这些都没有,那么它如何使应用程序响应?如果只有一个线程,则调用任何方法意味着在执行任何其他操作之前等待方法完成,并且该方法中的方法必须在继续之前等待结果,依此类推.

.net c# multithreading asynchronous async-await

220
推荐指数
8
解决办法
5万
查看次数

异步 - 留在当前线程?

我读过埃里克利珀的文章有关async,而约困惑的人曾与async关键字.他说 :

it(async)表示"此方法包含涉及等待异步操作的控制流,因此将由编译器重写为连续传递样式,以确保异步操作可以在正确的位置恢复此方法." 异步方法的全部意义你尽可能地留在当前的线程上

我不明白这一点.如果我执行一个异步方法(Task)并且它运行,它肯定会在另一个线程上运行.

此外,如果我写的方法使用await,(IMHO)它释放正常的控制流,和代码重构 相似" ContinueWith"后,在另一个线程.

我用(控制台)测试了它:

/*1*/   public void StartChain()
/*2*/   {
/*3*/           var a = FuncA();
/*4*/           Console.WriteLine(a.Result);
/*5*/   }
/*6*/   
/*7*/   public async Task < int > FuncA()
/*8*/   {
/*9*/           Console.WriteLine("A--" + Thread.CurrentThread.ManagedThreadId);
/*10*/           var t = await FuncB();
/*11*/           Console.WriteLine("B--" + Thread.CurrentThread.ManagedThreadId);
/*12*/           return t;
/*13*/   }
/*14*/   
/*15*/   public async Task < int > …
Run Code Online (Sandbox Code Playgroud)

async-await c#-5.0 .net-4.5

8
推荐指数
3
解决办法
4109
查看次数

为什么在Console App中没有捕获默认的SynchronizationContext?

我正在尝试更多地了解它SynchronizationContext,所以我制作了这个简单的控制台应用程序:

private static void Main()
{
    var sc = new SynchronizationContext();
    SynchronizationContext.SetSynchronizationContext(sc);
    DoSomething().Wait();
}

private static async Task DoSomething()
{
    Console.WriteLine(SynchronizationContext.Current != null); // true
    await Task.Delay(3000);
    Console.WriteLine(SynchronizationContext.Current != null); // false! why ?
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,await操作员会捕获当前的信息SynchronizationContext然后将其余的异步方法发布到它.

但是,在我的应用程序中,之后SynchronizationContext.Current为null await.这是为什么 ?

编辑:

即使我自己使用SynchronizationContext它也不会被捕获,尽管它的Post功能被调用.这是我的SC:

public class MySC : SynchronizationContext
{
    public override void Post(SendOrPostCallback d, object state)
    {
        base.Post(d, state);
        Console.WriteLine("Posted");
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我使用它的方式:

var sc = new MySC();
SynchronizationContext.SetSynchronizationContext(sc); …
Run Code Online (Sandbox Code Playgroud)

c# console-application synchronizationcontext async-await

6
推荐指数
1
解决办法
515
查看次数