相关疑难解决方法(0)

async /等待不同的线程ID

我最近正在阅读关于async/await的事情,我对以下事实感到困惑:我正在阅读的许多文章/帖子说明在使用异步等待时没有创建新线程(示例).

我创建了一个简单的控制台应用程序来测试它

class Program
    {
        static  void Main(string[] args)
        {
            Console.WriteLine("Main: " + Thread.CurrentThread.ManagedThreadId);
            MainAsync(args).Wait();
            Console.WriteLine("Main End: " + Thread.CurrentThread.ManagedThreadId);

            Console.ReadKey();
        }


        static async Task MainAsync(string[] args)
        {
            Console.WriteLine("Main Async: " + Thread.CurrentThread.ManagedThreadId);

            await thisIsAsync();
        }

        private static async Task thisIsAsync()
        {
            Console.WriteLine("thisIsAsyncStart: " + Thread.CurrentThread.ManagedThreadId);
            await Task.Delay(1);
            Console.WriteLine("thisIsAsyncEnd: " + Thread.CurrentThread.ManagedThreadId);

        }
    }
Run Code Online (Sandbox Code Playgroud)

以下代码的输出是:

Main: 8
Main Async: 8
thisIsAsyncStart: 8
thisIsAsyncEnd: 9
Main End: 8
Run Code Online (Sandbox Code Playgroud)

我错过了这一点,或者这个AsyncEnd是否具有与其他操作不同的线程ID?

编辑:

我已根据下面的答案更新了代码await Task.Delay(1),但我仍然看到相同的结果.

引用下面的答案:

Rather, it enables the …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous async-await

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

屈服声明实施

我希望以一种易于理解的形式了解该声明的所有内容yield.

我已经阅读了关于yield实现迭代器模式时的语句及其简易性.但是,大部分都非常干燥.我想深入研究微软如何处理收益率.

另外,你什么时候使用收益率突破?

.net c# iterator yield

7
推荐指数
4
解决办法
3584
查看次数

await Task.CompletedTask 是否意味着异步方法将同步运行?

static async Task WaitTaskCompleted()
{
    //Use Thread A before await Task.CompletedTask
    await Task.CompletedTask;
    //Will the code after await Task.CompletedTask always use Thread A, or there is chance to have a Thread B?
}
Run Code Online (Sandbox Code Playgroud)

这意味着await Task.CompletedTask将始终实际同步执行该方法?

c# task async-await

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

解释async再次等待

这是我的事件处理程序代码:

protected async void TestrunSaveExecute()
{
    bool saveResult = await SaveTestRunAsync();
}
Run Code Online (Sandbox Code Playgroud)

为了保持UI响应,我使用了async/ await方法.

根据我的理解,我现在可以在SaveTestRunAsync()不阻止UI的情况下进行一些冗长的操作,因为它通过使用await关键字解耦.

private async Task<bool> SaveTestRunAsync()
{
    //System.Threading.Thread.Sleep(5000); --> this blocks the UI
    await Task.Delay(5000); // this doesn't block UI

    return true;
}
Run Code Online (Sandbox Code Playgroud)

你能否解释为什么Thread.Sleep仍然阻止用户界面的呼叫,而Task.Delay不是?

.net c# async-await

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

标签 统计

c# ×4

async-await ×3

.net ×2

asynchronous ×1

iterator ×1

task ×1

yield ×1