Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中更好地将continueWith替换为async/await_C#_Async Await_Task_Token_Continuewith - Fatal编程技术网

C# 如何在C中更好地将continueWith替换为async/await

C# 如何在C中更好地将continueWith替换为async/await,c#,async-await,task,token,continuewith,C#,Async Await,Task,Token,Continuewith,我有C代码: 但是TaskDisposeTokenUner没有字段结果,并且您不能像这样编写等待taskCompletionSource.Task.Result。 如何最好地替换此代码 在任务中使用时,得到的值是任务的结果 因此,在您的情况下,TaskDisposeTokenUner已经是您要查找的UserActionResult值。您只需返回TaskDisposeTokenUner即可。您的原始方法具有同步签名;该方法中除委托之外的所有代码都将立即执行。ContinueWith委托是taskC

我有C代码:

但是TaskDisposeTokenUner没有字段结果,并且您不能像这样编写等待taskCompletionSource.Task.Result。 如何最好地替换此代码

在任务中使用时,得到的值是任务的结果


因此,在您的情况下,TaskDisposeTokenUner已经是您要查找的UserActionResult值。您只需返回TaskDisposeTokenUner即可。

您的原始方法具有同步签名;该方法中除委托之外的所有代码都将立即执行。ContinueWith委托是taskCompletionSource.Task完成之后执行的唯一代码。因此,要复制此行为,您需要将ContinueWith委托移动到方法的末尾,这样所有同步代码都会像以前一样首先执行:

public async Task<TestClass> WaitForUserInput(IResource resource, CancellationToken token)
{
  var button = resource.GetResource();

  var taskCompletionSource = new TaskCompletionSource<UserActionResult>();
  IDisposable cancellationTokenReg = token.Register(
                                      () => taskCompletionSource.SetResult(new TestClass()));

  button.TouchEvent += Subscribe;
  button.Disabled = true;

  var result = await taskCompletionSource.Task;
  cancellationTokenReg.Dispose();
  return result;
}
var taskDisposeTokenUnner应该已经是结果-您检查过它的类型了吗?
public class SimpleClass{

    public async Task<TestClass> WaitForUserInput(IResource resource, CancellationToken token)
    {
        var button = resource.GetResource();

        var taskCompletionSource = new TaskCompletionSource<UserActionResult>();
        IDisposable cancellationTokenReg = token.Register(
                                      () => taskCompletionSource.SetResult(new TestClass()));

        var taskDisposeTokenUnreg = await taskCompletionSource.Task
        cancellationTokenReg.Dispose();
        return taskDisposeTokenUnreg.Result;

        button.TouchEvent += Subscribe;
        button.Disabled = true;

        return taskDisposeTokenUnreg;
    }
}     
public async Task<TestClass> WaitForUserInput(IResource resource, CancellationToken token)
{
  var button = resource.GetResource();

  var taskCompletionSource = new TaskCompletionSource<UserActionResult>();
  IDisposable cancellationTokenReg = token.Register(
                                      () => taskCompletionSource.SetResult(new TestClass()));

  button.TouchEvent += Subscribe;
  button.Disabled = true;

  var result = await taskCompletionSource.Task;
  cancellationTokenReg.Dispose();
  return result;
}
public async Task<TestClass> WaitForUserInput(IResource resource, CancellationToken token)
{
  var button = resource.GetResource();

  var taskCompletionSource = new TaskCompletionSource<UserActionResult>();
  using var cancellationTokenReg = token.Register(
                                      () => taskCompletionSource.SetResult(new TestClass()));

  button.TouchEvent += Subscribe;
  button.Disabled = true;

  return await taskCompletionSource.Task;
}