我有一个任务来检查设备每秒的时间:
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是一个简单的自定义事件。
答案 0 :(得分:2)
在调用“checkTimeStart()”方法之前,请检查是否有对“TimeUpdateEvent”事件的订阅。我认为您没有进行任何订阅,因此在调用该事件系统时会停止。如果你将代码的调用部分放在try catch块中:
try
{
TimeUpdateEvent.Invoke(this, new TimeUpdateEventArgs(time));
}
catch (Exception ex)
{
throw;
}
你会得到一个NullReferenceException .... 所以请检查该活动的订阅。
祝你一切顺利!