使用委托的异步方法
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,它演示了该场景。
如何让主线程等待 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,它演示了该场景。