使用委托的异步方法

Asynchronous method using delegates

如何让主线程等待 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);
        }

    }
}

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

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,它演示了该场景。