Aku*_*uma 4 c# extension-methods multithreading action task
我正在尝试为Action创建一个方便的扩展方法,以便在延迟后基本上运行该操作:到目前为止,我的扩展看起来像这样
public static void DelayAction(this Action DelayedAction, int millisecondDelay, CancellationToken Token)
{
Task t = Task.Factory.StartNew(() => { Thread.Sleep(millisecondDelay); }, Token, TaskCreationOptions.None, TaskScheduler.Default);
t.ContinueWith(_ => DelayedAction, Token, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数我调用它反过来使用这些扩展
private void DelayTask(Action ActiontoDelay, int millisecondDelay)
{
ActiontoDelay.DelayAction(millisecondDelay, _TokenSource.Token);
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
DelayTask(() => { _SomeFunction(SomeArgs); }, 1500);
Run Code Online (Sandbox Code Playgroud)
但这一切似乎都落到了整体而且行动从未触发过.我哪里错了?
编辑17-11-11 2300hrs:
我删除了通用扩展方法,因为它与此示例无关.
此处也发表评论,因为它没有在评论中清楚地格式化代码
如果不是通话
DelayTask(() => { _SomeFunction(SomeArgs); }, 1500);
Run Code Online (Sandbox Code Playgroud)
我直接这样做:
Task t = Task.Factory.StartNew(() => { Thread.Sleep(1500); }, Token, TaskCreationOptions.None, TaskScheduler.Default);
t.ContinueWith(() => { _SomeFunction(SomeArgs); }, Token, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
它工作正常(对不起,如果有任何语法错误,我已经从内存中完成)所以我相信我的问题是在处理尼克巴特勒的答案逃避的行动
您的继续是返回DelayedAction委托,而不是调用它:
t.ContinueWith(_ => DelayedAction(), Token, ...
Run Code Online (Sandbox Code Playgroud)