如何异步和顺序调用事件?
How can I invoke events asynchronously and sequentially?
我有以下 class:
class Integration
{
public event EventHandler<LogEventArgs> LogMessageEvent
protected virtual void OnLog(LogEventArgs e)
{
if(LogMessageEvent != null)
LogMessageEvent(this, e);
}
public void SomeWork()
{
//Do some things...
var e = new LogMessageEvent("The file was copied...");
OnLog(e);
//Do more things...
var e = new LogMessageEvent("Another thing...");
OnLog(e);
}
}
我需要事件订阅者不阻塞 SomeWork 方法并且执行是顺序的("The file was copied..." 事件总是首先执行)
我试过任务:
Task.Run(... OnLog())....
但问题是有时 稍后 创建的任务会在 之前 之前创建的任务引发事件。 (不出所料,考虑到我没有进行同步。)
我怀疑有一些最简单的方法可以完成这个任务(顺序和异步调用事件)。
存储您最后使用的 Task
-对象并使用 ContinueWith。
它告诉您的任务在第一个任务完成后继续新的事件调用。所以事件不是并行触发而是顺序触发。
ContinueWith
returns一个新的Task
-对象,所以你需要更新你的引用,这样下一个ContinueWith
-调用才能成功。
这不是线程安全的,但只要你只从一个线程调用它,它就应该可以工作(对我来说非常完美)。
我有以下 class:
class Integration
{
public event EventHandler<LogEventArgs> LogMessageEvent
protected virtual void OnLog(LogEventArgs e)
{
if(LogMessageEvent != null)
LogMessageEvent(this, e);
}
public void SomeWork()
{
//Do some things...
var e = new LogMessageEvent("The file was copied...");
OnLog(e);
//Do more things...
var e = new LogMessageEvent("Another thing...");
OnLog(e);
}
}
我需要事件订阅者不阻塞 SomeWork 方法并且执行是顺序的("The file was copied..." 事件总是首先执行)
我试过任务:
Task.Run(... OnLog())....
但问题是有时 稍后 创建的任务会在 之前 之前创建的任务引发事件。 (不出所料,考虑到我没有进行同步。)
我怀疑有一些最简单的方法可以完成这个任务(顺序和异步调用事件)。
存储您最后使用的 Task
-对象并使用 ContinueWith。
它告诉您的任务在第一个任务完成后继续新的事件调用。所以事件不是并行触发而是顺序触发。
ContinueWith
returns一个新的Task
-对象,所以你需要更新你的引用,这样下一个ContinueWith
-调用才能成功。
这不是线程安全的,但只要你只从一个线程调用它,它就应该可以工作(对我来说非常完美)。