我有这个(有效的)异步轮询回调循环的基本实现:
public void Start(ICallback callback)
{
if (Callback != null)
Stop();
Console.WriteLine("STARTING");
Callback = callback;
cancellation = new CancellationTokenSource();
this.task = Task.Run(() => TaskLoop(), cancellation.Token);
Console.WriteLine("STARTED");
}
public void Stop()
{
if(Callback==null)
{
Console.WriteLine("ALREADY stopped");
return;
}
Console.WriteLine("STOPPING");
cancellation.Cancel();
try
{
task.Wait();
}
catch (Exception e)
{
Console.WriteLine($"{e.Message}");
}
finally
{
cancellation.Dispose();
cancellation = null;
Callback = null;
task = null;
Console.WriteLine("STOPPED");
}
}
private void TaskLoop()
{
int i = 0;
while (!cancellation.IsCancellationRequested)
{
Thread.Sleep(1000);
Console.WriteLine("Starting iteration... {0}", i);
Task.Run(() =>
{
//just for testing
Callback.SendMessage($"Iteration {i} at {System.DateTime.Now}");
}).Wait();
Console.WriteLine("...Ending iteration {0}", i++);
}
Console.WriteLine("CANCELLED");
实际上是通过COM从非托管C ++调用的,所以这是一个库项目(而回调是COM编组的对象),因此想先测试设计。
我正在切换为使用async
范式,想知道它是否应该像在我的方法除垢上撒一些async
灰尘并将Wait()
调用交换为await
一样简单?显然,Thread.Sleep
将更改为Task.Delay
。
我相当确定,COM将为编组目的将一个线程专用于此对象,并且非托管C ++不了解.Net异步模型,因此是否有需要注意的陷阱/陷阱?
非托管C ++不了解.Net异步模型,因此是否有需要注意的陷阱/陷阱?
只是那个。将async
/ await
应用于内部代码(例如TaskLoop
)很好,但是您不能让它扩展到COM边界。因此无法将Start
和Stop
设置为async
。