【发布时间】:2014-07-15 13:07:01
【问题描述】:
我正在尝试编写类似光纤的代码,以便我可以进入任务并摆脱它。我试过的代码:
class TaskActivity {
CancellationTokenSource _m=new CancellationTokenSource( int.MaxValue )
,_t=new CancellationTokenSource( int.MaxValue );
public async Task PauseTask( ) { //call and await it when I want to pause task inside itself
_m.Cancel( );
_t = new CancellationTokenSource( int.MaxValue );
while( !_t.IsCancellationRequested )
await Task.Yield( );
}
public async Task ResumeTask( ) { //call and wait for it when I want to resume a task from the main context
_t.Cancel( );
_m = new CancellationTokenSource( int.MaxValue );
while( !_m.IsCancellationRequested )
await Task.Yield( );
}
}
它运行良好,但是当我在 Task\Main 上下文中调用 Thread.Sleep 时它会消耗大量 CPU,因为它在循环中运行而不会在另一侧停止。当我尝试await Task.Delay( int.MaxValue, (_m\_t) ); 而不是await Task.Yield( ); 时,它并没有消耗很多CPU,而是有时会死锁,因为Task 不会屈服于另一个Task。
我的问题是,如何融合Task.Delay 和Task.Yield 使其不消耗大量CPU,但仍然可以让其他任务工作?
【问题讨论】:
-
@Noseratio 看到了,但我想在主上下文和任务之间切换上下文,而不仅仅是恢复和暂停。
-
@Noseratio 好吧,我很好,我只需要那个回答者接受我的编辑,因为他的代码有错误,我会接受。还是谢谢!
-
不用担心,只是我不认为这是你应该在上下文之间切换的方式,如果你想保持两个任务都处于活动状态。