从 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<T>
得到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<T>
以上是关于从 Task<AuthenticationResult> 转换为 AuthenticationResult的主要内容,如果未能解决你的问题,请参考以下文章
从 Microsoft UWP 上的异步方法返回 Task<string>
如何从通过 API 返回的 Task<IActionResult> 获取值以进行单元测试
如何从 Firebase Task<AuthResult> 登录失败中检索错误代码?
参数 1:无法从 'System.Threading.Tasks.Task<Project.Models.Booking>' 转换为 Project.Models.Booking