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

时间:2015-02-15 08:07:04

标签: c# events 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,但这种方法是在便携式类库中实现的。我需要它与平台无关。因此,每个用户在收到TimeUpdateEvent时都可以更新自己的ui。 TimeUpdateEvent是一个简单的自定义事件。

1 个答案:

答案 0 :(得分:2)

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

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

你会得到一个NullReferenceException .... 所以请检查该活动的订阅。

祝你一切顺利!