下面的例子说明了我的设计。有一个 while true 循环做某事并通过一个事件通知它已经对所有订阅者做了某事。我的应用程序在通知所有订阅者之前不应继续执行,只要有人不在回调上放置异步无效,它就可以工作。
如果有人在回调上放置了 async void 以等待某些任务,那么我的循环可以在回调完成之前继续。我可以做哪些其他设计来避免这种情况。
它的第 3 方插件注册了主题并订阅了事件,所以我无法控制他们是否放置了 async void。可以理解,我无法为 EventHandler 执行任务回调,那么我有什么替代方案可以使用 .net 4.5。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
public class Test
{
public event EventHandler Event;
public void DoneSomething()
{
if (Event != null)
Event(this,EventArgs.Empty);
}
}
class Program
{
static void Main(string[] args)
{
var test = new Test();
test.Event += test_Event;
test.Event +=test_Event2;
while(true)
{
test.DoneSomething();
Thread.Sleep(1000);
}
}
private static void test_Event2(object sender, EventArgs e)
{
Console.WriteLine("delegate 2");
}
static async void test_Event(object sender, EventArgs e)
{
Console.WriteLine("Del1gate 1");
await Task.Delay(5000);
Console.WriteLine("5000 ms later");
}
}
}