我发现我无法区分受控/合作与"不受控制"的任务/代表取消,而无需检查特定任务或代表背后的来源.
具体来说,我总是假设当OperationCanceledException从"低级操作"中捕获抛出时,如果引用的令牌无法与当前操作的令牌匹配,那么它应该被解释为失败/错误.这是它放弃(退出)的"低级操作"的声明,但不是因为你要求它这样做.
不幸的是,TaskCompletionSource无法关联一个CancellationToken作为取消的原因.因此,没有内置调度程序支持的任何任务无法传达其取消的原因,并且可能错误地将合作取消误报为错误.
更新:由于.NET 4.6 TaskCompletionSource 可以关联起来CancellationToken ,如果新的过载SetCanceled或TrySetCanceled使用.
例如以下内容
public Task ShouldHaveBeenAsynchronous(Action userDelegate, CancellationToken ct)
{
var tcs = new TaskCompletionSource<object>();
try
{
userDelegate();
tcs.SetResult(null); // Indicate completion
}
catch (OperationCanceledException ex)
{
if (ex.CancellationToken == ct)
tcs.SetCanceled(); // Need to pass ct here, but can't
else
tcs.SetException(ex);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
return tcs.Task;
}
private void OtherSide()
{
var cts …Run Code Online (Sandbox Code Playgroud) c# asynchronous task task-parallel-library taskcompletionsource
我在我的主分支中做了一些我不再认为合适的更改.为了论证,我有一个提交哈希命名791fda4e1ac0e1a393e01340bf0fba3f333a73ff,我现在想要制作我的HEAD,因为当回购中的一切都稳定时.我试过做以下事情:
git reset 791fda4e1ac
git reset --soft HEAD@{1}
git commit -m "Revert to 791fda4e1ac"
git reset --hard
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时git push origin,我会被拒绝,因为来源认为这是一个非快速的推动:
! [rejected] master -> master (non-fast-forward)
Run Code Online (Sandbox Code Playgroud)
什么是将我的HEAD恢复为提交哈希791fda4e1ac并在那里获取原始服务器的正确方法?