相关疑难解决方法(0)

Task.Yield()与Task.Delay(0)

难道Delay(0)总要得到内联?根据我的经验,它确实:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication
{
    class Program
    {
        static async Task Test()
        {
            await Task.Yield();
            Console.WriteLine("after Yield(), thread: {0}", Thread.CurrentThread.ManagedThreadId);
            await Task.Delay(0);
            Console.WriteLine("after Delay(0), thread: {0}", Thread.CurrentThread.ManagedThreadId);
            await Task.Delay(100);
            Console.WriteLine("after Delay(100), thread: {0}", Thread.CurrentThread.ManagedThreadId);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);
            Test().Wait();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个控制台应用程序,因此线程池用于继续.输出:

Main thread: 11
after Yield(), thread: 7
after Delay(0), thread: 7
after Delay(100), thread: 6
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading task-parallel-library async-await

14
推荐指数
2
解决办法
6581
查看次数

Task.Delay(0)不是异步的

我有以下代码(是的,我可以模拟JavaScript setTimeoutAPI)

    async void setTimeout(dynamic callback, int timeout)
    {
        await Task.Delay(timeout);
        callback();
    }
Run Code Online (Sandbox Code Playgroud)

它看起来像timeout > 0,在setTimeout异步其中,控制返回到作品calleeawait,并callback在任务完成后调用异步运行.但是,timeout == 0函数以同步方式运行时(代码总是在没有上下文切换的同一线程中经过await行).在进一步挖掘时,事实证明这Task.Delay是以这种方式实现的(Task.Yield()与Task.Delay(0))

不知道是否有一种方法,使Task.Delay(0)或异步的替代解决方案,使我的setTimeout功能异步时timeout0?(这样我可以模仿JavaScript setTimeout 功能)我看到有关使用Task.FromResult(true)或的讨论Task.WhenAll,但它们似乎不起作用.

事实上,我可以使用Task.Delay(1)Task.Delay(0)不是看起来有机.

c# multithreading asynchronous async-await

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