相关疑难解决方法(0)

异步 - 留在当前线程?

我读过埃里克利珀的文章有关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
查看次数

C#async/await有/无等待(火灾和忘记)

我有以下代码:

    static async Task Callee()
    {
        await Task.Delay(1000);
    }

    static async Task Caller()
    {
        Callee(); // #1 fire and forget
        await Callee(); // #2 >1s
        Task.Run(() => Callee()); // #3 fire and forget
        await Task.Run(() => Callee()); // #4 >1s
        Task.Run(async () => await Callee()); // #5 fire and forget
        await Task.Run(async () => await Callee()); // #6 >1s
    }

    static void Main(string[] args)
    {
        var stopWatch = new Stopwatch();
        stopWatch.Start();
        Caller().Wait();
        stopWatch.Stop();
        Console.WriteLine($"Elapsed: {stopWatch.ElapsedMilliseconds}");
        Console.ReadKey();
    }
Run Code Online (Sandbox Code Playgroud)

#1以最简单的方式点火和忘记.#2只是等待.有趣的东西从#3开始.这些电话背后的深度逻辑是什么?

我知道在ASP.NET中使用fire'n'forget作为警告的指向这里 …

c# asynchronous async-await

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

标签 统计

async-await ×2

.net-4.5 ×1

asynchronous ×1

c# ×1

c#-5.0 ×1