为什么调用事件会取消任务?
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 ....
所以请检查该事件的订阅情况。
祝你一切顺利!
我有一个每秒检查设备时间的任务:
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 .... 所以请检查该事件的订阅情况。
祝你一切顺利!