【发布时间】: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