【问题标题】:Asynchronous method using delegates [duplicate]使用委托的异步方法[重复]
【发布时间】:2019-10-10 17:40:30
【问题描述】:

如何让主线程等到 DisplayAdd 显示输出?如果我在最后添加一个 Console.Read() ,一切正常,但还有其他方法可以告诉主线程等到 Calculate() 完成吗?

namespace TestDelegate
{
    public class Add
    {
        public delegate void SendResult(int i);
        public SendResult WhereToSend;

        public async void Calculate (int number)
        {
            Console.WriteLine("Entered");
            int result = number + number;
            await Task.Delay(4000);
            WhereToSend (result);
           // Console.Read();

        }

    }
}


namespace TestStuff
{
    class Program
    {

        static void Main(string[] args)
        {


            Add obj = new Add();
            Console.WriteLine("Started Calculating");
            obj.Calculate(10);
            obj.WhereToSend = DisplayAdd;

        }

        static void DisplayAdd(int value)
        {

            Console.WriteLine(value);
        }

    }
}

【问题讨论】:

  • 如标记的重复项中所述,您遇到此问题的原因是您的async 方法返回void。你需要返回一个Task,然后你可以await它。在相关说明中:您的 async 方法实现已损坏,因为它依赖于调用者和方法执行之间的时间。实现它的正确方法是确保调用者在调用方法之前设置了WhereToSend(如果不是,则抛出异常),或者更好的是,将其设置为方法的参数的一个领域。至少,使用?. 调用委托来对抗null

标签: c# asynchronous delegates


【解决方案1】:

您可以将委托定义为Task 返回类型(等待类型)。这样,该方法将在主线程终止之前完成。

namespace TestDelegate
{
    public delegate Task SendResult(int i);
    public class Add
    {   
        public SendResult WhereToSend;

        public async Task Calculate (int number)
        {
            Console.WriteLine("Entered");
            int result = number + number;

            await WhereToSend (result);
        }
    }
}


namespace TestStuff
{
    class Program
    {

        static void Main(string[] args)
        {   
            Add obj = new Add();
            obj.WhereToSend = DisplayAdd;
            Console.WriteLine("Started Calculating");
            obj.Calculate(10).Wait();
        }

        static async Task DisplayAdd(int value)
        {
            // Some awaitable operation like below as per your business logic
            await Task.Delay(1);
            Console.WriteLine(value);
        }

    }
}

在上面的程序中,我将Calculate 方法的定义更改为async Task,以便将其标记为可等待。 async void 方法主要用于 UI 事件处理程序或触发后忘记方法。

请查看this dotnetfiddle,它演示了该场景。

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多