如何异步和顺序调用事件?

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-调用才能成功。

这不是线程安全的,但只要你只从一个线程调用它,它就应该可以工作(对我来说非常完美)。