C# 如何在C中更好地将continueWith替换为async/await
我有C代码: 但是TaskDisposeTokenUner没有字段结果,并且您不能像这样编写等待taskCompletionSource.Task.Result。 如何最好地替换此代码 在任务中使用时,得到的值是任务的结果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
因此,在您的情况下,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;
}