如何在任务中引发事件?

时间:2017-01-17 19:55:06

标签: c# events task

让我们说我需要实现一个执行长时间运行计算的C#类库。当计算中计算的某些值超过某个阈值时,我必须通知用户,

在这种情况下,如何在任务中实现事件?那是不是一个合适的解决方案?如果没有,我如何通知用户我的任务内发生的事情?

2 个答案:

答案 0 :(得分:1)

根据您在说“通知用户”时希望发生的事情,有很多选项,有些选项比其他选项更复杂(例如使用像RabbitMQ这样的消息库)。

但是,对您的问题的简单回答会将“通知用户”解释为“通知调用者我的长时间运行过程”。在这种情况下,您可以在具有异步长时间运行过程的类中创建一个EventHandler,并在您想要“通知”调用者时简单地调用该事件处理程序。

该类的代码可能如下所示:

public class LongTask
{

    public event EventHandler StillInProgress;


    public async Task<bool> LongRunningProcessAsync()
    {

        await Task.Delay(5000);

        OnStillInProgress(new EventArgs());

        await Task.Delay(5000);


        return true;
    }

    protected virtual void OnStillInProgress(EventArgs e)
    {
        StillInProgress?.Invoke(this, e);
    }
}

在上面的代码中,您长时间运行的进程的调用者也可以订阅您的“StillInProgress”事件,并在您调用它时收到通知。

调用者订阅事件看起来像这样:

var longRun = new LongTask();
longRun.StillInProgress += LongRun_StillInProgress;

// Method that will handle the "notification"
private void LongRun_StillInProgress(object sender, EventArgs e)
{
    Debug.WriteLine("InProgress");
}

还有其他选择,但这可能是最直接的选择。

答案 1 :(得分:0)

我已经阅读并尝试了更多问题,并且看到我所需要的是在满足任务的某些条件时在UI线程上运行代码,最好去IProgress路由(Peter Bons和Servy的推荐)。更简单,更好,更完全支持。 Peter Bons发布的链接(由Stephen Cleary撰写)是关于如何做的一篇很好的文章。

感谢大家的帮助。