小编Sen*_*ith的帖子

可以检测.NET库代码中的不受控制的取消吗?

我发现我无法区分受控/合作与"不受控制"的任务/代表取消,而无需检查特定任务或代表背后的来源.

具体来说,我总是假设当OperationCanceledException从"低级操作"中捕获抛出时,如果引用的令牌无法与当前操作的令牌匹配,那么它应该被解释为失败/错误.这是它放弃(退出)的"低级操作"的声明,但不是因为你要求它这样做.

不幸的是,TaskCompletionSource无法关联一个CancellationToken作为取消的原因.因此,没有内置调度程序支持的任何任务无法传达其取消的原因,并且可能错误地将合作取消误报为错误.

更新:由于.NET 4.6 TaskCompletionSource 可以关联起来CancellationToken ,如果新的过载SetCanceledTrySetCanceled使用.

例如以下内容

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

6
推荐指数
1
解决办法
1009
查看次数

Git:将HEAD移回上次提交

我在我的主分支中做了一些我不再认为合适的更改.为了论证,我有一个提交哈希命名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并在那里获取原始服务器的正确方法?

git

5
推荐指数
1
解决办法
5634
查看次数