【问题标题】:Convert from Task<AuthenticationResult> to AuthenticationResult从 Task<AuthenticationResult> 转换为 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 阻止任务。这将冻结您的线程而不是异步等待。例如,当您看到桌面应用程序在等待连接时冻结时会发生这种情况

标签: c# .net asynchronous task-parallel-library


【解决方案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;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2021-11-27
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多