从 Task<AuthenticationResult> 转换为 AuthenticationResult

Posted

技术标签:

【中文标题】从 Task<AuthenticationResult> 转换为 AuthenticationResult【英文标题】:Convert from Task<AuthenticationResult> to AuthenticationResult 【发布时间】:2018-06-19 10:07:44 【问题描述】:

我的结果是:

var authResult = DoSomething

返回任务

如何转换:Task 到 AuthenticationResult

这个AuthenticationResult我必须传入一个类方法作为参数。

Class1 A = new Class1()

A.Method1(AuthenticationResult)

【问题讨论】:

await 任务得到它的结果(这将使你的方法async)或使用GetAwaiter().Value(如果你不能) 使用异步/等待模式 它返回Task,因为这是一个还没有完成的异步操作。使用await 等待它完成,获取结果并继续原始线程,而不会在等待时阻塞。 async/await 在 MSDN 文档、博客、课程等中得到了广泛的介绍。不要尝试使用 .Wait().Result 阻止任务。这将冻结您的线程而不是异步等待。例如,当您看到桌面应用程序在等待连接时冻结时会发生这种情况 【参考方案1】:

如果您不能使用async/await 关键字,请考虑通过延续机制直接使用TPL(任务并行库)。

Class1 A = new Class1();

Task<AuthenticationResult> authenticationTask = DoSomething();

// Register an Action<Task<T>> to run when the task has transitioned RanToCompletion 
// or Faulted
authenticationTask.ContinueWith(p =>

    if(p.IsFaulted) // Handle any exceptions!
    
        Exception ex = p.Exception
    
    else
    
        // Success! :D Process the result as usual.
        // Task<T>.Result is an instance of T - in our case, AuthenticationResult. 
        // It would be default(T) if a task has faulted or has not completed. 
        // At this point, we are confident that the task has completed without a fault.
        A.Method1(p.Result);
    
);

这里的缺点是如果没有更多的管道,您将无法从此方法返回最终值。 async/await 为您完成所有这些,但这是可以实现的。也没有保证您将在原始线程上运行(在 UI 场景中通常需要),但这也是可以实现的。您可以在另一个问题中找到这些问题的答案。

【讨论】:

【参考方案2】:

你总是可以从Task&lt;T&gt;得到T写作:

var task = DoSomething(); // type Task<T>
var result = task.Result; // type T

如果DoSomething() 允许,您可以使用 async/await 模式:

var result = await DoSomethong(); // type T

【讨论】:

阻止任务是个坏主意 你应该永远访问.Result,除非你知道它已经完成; await DoSomething() 很好,但你真的应该在第一个周围有一个 if(task.IsCompleted) ... 障碍 DoSomething 与是否可以在调用方法中使用await 无关。只要调用方法async关键字,所有返回taks的方法都可以和await一起使用。你不需要知道任何关于DoSomething() 的信息,除了它返回一个Task&lt;T&gt;

以上是关于从 Task<AuthenticationResult> 转换为 AuthenticationResult的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Task<> 隐式转换类型

从 Microsoft UWP 上的异步方法返回 Task<string>

如何从通过 API 返回的 Task<IActionResult> 获取值以进行单元测试

如何从 Firebase Task<AuthResult> 登录失败中检索错误代码?

参数 1:无法从 'System.Threading.Tasks.Task<Project.Models.Booking>' 转换为 Project.Models.Booking

防止针对 Task<t> 进行单元测试