异步 - 等待关键字查询

 丁可丁可_136 发布于 2023-02-13 12:51

有一些关于Async-await的事情让我神秘化,我想知道是否有人能向我解释一些事情:

请注意,我的查询是在阅读之后:http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence -await.aspx

所以Eric Lippert说

方法上的"async"修饰符并不意味着"此方法被自动调度为在工作线程上异步运行"

为什么我们需要在我们想要异步运行的方法上放置Async?即

private async Task GetMeInt()
{
    return 0;
}
private async void stuff()
{
    var num = GetMeInt();
    DoStuff();
    int end = await num;
    for (int i = 0; i < end; i++)
        Console.WriteLine("blahblahblah");
}

问题是我们不希望GetMeInt在内部实际执行任何异步操作.我们只是希望它同步运行,但我们希望它在被另一个方法调用时作为一个整体异步运行.将async仅放在Stuff()方法上并允许GetMeInt()在另一个线程上运行并稍后返回似乎更明智.

基本上我相信它会是这样的:

private int GetMeInt()
{
    return 0;
}

private async void stuff()
{
    int? num = null;
    Thread t = new Thread(() => num = GetMeInt());
    t.Start();
    DoStuff();
    t.Join();
    for (int i = 0; i < (num??0); i++)
        Console.WriteLine("blahblahblah");
}

毕竟,是不是只在Stuff()方法上创建的状态机?更令人困惑的是,如果我在GetMeInt中放入异步,编译器会发出警告,在任务对象中强制包装GetMeInt()返回的内容并不是很好,这种类型的东西会阻止我们使用其他人异步编写的方法.

他们为什么不以这样的方式设计它,所以你可以做这样的事情(这是未经测试的理论代码的领域!).我认为有理由与框架有关,但我认为这种事情会更直观.我错过了关于这种异步业务的明显信息吗?我想我只是忽略警告并继续,我的强迫症就是不会放过这个.

private async void stuff()
{
    var s = Example.Run(Delegate.CreateDelegate(typeof(Delegate), this, "GetMeInt"));
    DoStuff();
    for (int i = 0; i < s.Result; i++)
        Console.WriteLine("blahblahblah");
}

public class Example 
{
    Thread t;
    Object r;
    private Example(){}
    public static Example Run(Delegate pFunc) 
    {
        Example output = new Example();
        output.t = new Thread(() => output.r = (T)pFunc.DynamicInvoke());
        output.t.Start();
        return output;
    }

    public sealed class Example : Example
    {

        public T Result
        {
            get
            {
                t.Join();
                return (T)r;
            }
            private set;
        }
    }
}

我真的不明白,任何有关这些东西的解释都会受到赞赏.

1 个回答
  • 所有的async修饰手段都是这种方法能够做到的await事情.

    由于编译器警告你,除非你真的有东西,否则它完全没用await.

    你实际上是在询问如何在后台线程上工作,然后异步等待它完成.
    您可以使用Task.Run()在后台运行代码,然后await使用生成的任务.

    2023-02-13 12:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有