相关疑难解决方法(0)

为所有服务器端代码调用ConfigureAwait的最佳实践

当你有服务器端代码(即一些ApiController)并且你的函数是异步的 - 所以它们返回Task<SomeObject>- 你认为最好的做法是等待你调用的函数ConfigureAwait(false)吗?

我已经读过它更高效,因为它不必将线程上下文切换回原始线程上下文.但是,使用ASP.NET Web Api,如果您的请求是在一个线程上进行的,并且等待某些函数和调用ConfigureAwait(false),则可能会在返回ApiController函数的最终结果时将您置于不同的线程上.

我在下面输入了一个我正在谈论的例子:

public class CustomerController : ApiController
{
    public async Task<Customer> Get(int id)
    {
        // you are on a particular thread here
        var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false);

        // now you are on a different thread!  will that cause problems?
        return customer;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await asp.net-web-api

517
推荐指数
4
解决办法
18万
查看次数

尝试在DocumentDB中创建文档时获取"任务已取消"

当我尝试使用以下代码在我的DocumentDB数据库中创建文档时,代码挂起我调用CreateDocumentAsync()的地方,并最终给我"任务被取消"错误.

知道为什么吗?

public static async Task<Employee> CreateEmployee(Employee emp)
{
   try
   {
      using (client = new DocumentClient(new Uri(endPointUrl), authorizationKey))
      {
         //Get the database
         var database = await GetDatabaseAsync();

         //Get the Document Collection
         var collection = await GetCollectionAsync(database.SelfLink, "Employees");

         await client.CreateDocumentAsync(collection.SelfLink, emp);

         // Do something else with employee
      }
   }
   catch
   {
      // Handle error
   }

   return emp;
}
Run Code Online (Sandbox Code Playgroud)

PS为简洁起见,我没有包含GetDatabaseAsync()和GetCollectionsAsync()部分的代码.请注意,员工文档是在我的数据库中创建的.因此,此代码清楚地连接到DocumentDB数据库,查找集合并创建文档.

只是不确定为什么它会挂起并最终返回错误.

*****更新******

这是错误详细信息:任务已取消.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.Threading.Tasks.TaskCanceledException:任务已取消.来源错误:

HttpResponseMessage response = await client.PostAsJsonAsync("api/hr/register", employee);
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

[TaskCanceledException: A task was canceled.]
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +10915395
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) …
Run Code Online (Sandbox Code Playgroud)

c# azure-cosmosdb

8
推荐指数
2
解决办法
4万
查看次数