为什么调用事件会取消任务?

Why invoking the event cancels the task?

我有一个每秒检查设备时间的任务:

public void checkTimeStart()
{
  CancellationTokenSource cTokenSource = new CancellationTokenSource();
  CancellationToken ct = cTokenSource.Token;
  Task task = Task.Factory.StartNew(async () =>
    {
      ct.ThrowIfCancellationRequested();
      while (!ct.IsCancellationRequested)
         {
           await Task.Delay(1000);
           string time = getTime();
           TimeUpdateEvent.Invoke(this, new TimeUpdateEventArgs(time));
          }
     }, cTokenSource.Token);
}

如果我删除 TimeUpdateEvent.Invoke(this, new TimeUpdateEventArgs(time));,这将非常有效。但是当我尝试调用事件时,任务完全停止并且它永远不会进入 while 循环!每当我从设备收到新时间时,我都需要此事件来更新时间文本框。


我知道可以直接从匿名任务更新 ui,但此方法是在可移植 class 库中实现的。我需要它独立于平台。因此每个用户都可以在收到 TimeUpdateEvent 时更新自己的 ui。 TimeUpdateEvent 是一个简单的自定义事件。

请在调用"checkTimeStart()"方法前检查是否有订阅事件"TimeUpdateEvent"。我认为您没有进行任何订阅,因此调用该事件系统会停止。如果将代码的调用部分放在 try catch 块中:

try
{
    TimeUpdateEvent.Invoke(this, new TimeUpdateEventArgs(time));
}
catch (Exception ex)
{
    throw;
}

您将得到一个 NullReferenceException .... 所以请检查该事件的订阅情况。

祝你一切顺利!