C# 如何在任务中引发事件?

C# 如何在任务中引发事件?,c#,events,task,C#,Events,Task,假设我需要实现一个C#类库,它执行一个长时间运行的计算。当计算中计算的某些值超过某个阈值时,我必须通知用户,仅此而已 在这种情况下,如何在任务中实现事件?这是正确的解决方案吗?如果没有,我如何将任务中发生的事情通知用户?根据您在说“通知用户”时希望发生的事情,有很多选项,有些选项比其他选项更复杂(例如,使用RabbitMQ之类的消息传递库) 但是,对您的问题的简单回答会将“通知用户”解释为“通知调用方我的长时间运行的进程”。在这种情况下,您可以在具有异步长时间运行的进程的类中创建一个EventH

假设我需要实现一个C#类库,它执行一个长时间运行的计算。当计算中计算的某些值超过某个阈值时,我必须通知用户,仅此而已


在这种情况下,如何在任务中实现事件?这是正确的解决方案吗?如果没有,我如何将任务中发生的事情通知用户?

根据您在说“通知用户”时希望发生的事情,有很多选项,有些选项比其他选项更复杂(例如,使用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);
    }
}
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");
}

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

我已经阅读并尝试了更多关于这个问题的内容,并且看到我所需要的只是在满足任务的某些条件时在UI线程上运行代码,所以最好采用IProgress路线(Peter Bons和Servy的建议)。更简单、更好、完全支持。彼得·邦斯(由斯蒂芬·克利里(Stephen Cleary)撰写)发布的链接是一篇关于如何做到这一点的伟大著作


感谢大家的帮助。

是的,请参阅TPL是一种管理异步操作而不是使用事件的方法。虽然理论上你可以触发一个事件,但是你应该简单地使用TPL来做任何你想做的异步操作,而不是使用事件。你说的“不再”是指计算在那一点停止吗?这个事件可以引发多次吗?我所说的“没有更多”是指“通知用户并继续进行计算”。计算在任何情况下都不会中止。该事件可在计算过程中引发多次(从0到n次)。