让我们说我需要实现一个执行长时间运行计算的C#类库。当计算中计算的某些值超过某个阈值时,我必须通知用户,
在这种情况下,如何在任务中实现事件?那是不是一个合适的解决方案?如果没有,我如何通知用户我的任务内发生的事情?
答案 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撰写)是关于如何做的一篇很好的文章。
感谢大家的帮助。