当有一个或两个任务时,它可以正常工作,但当我们列出多个任务时,会抛出错误“任务已取消”。

List<Task> allTasks = new List<Task>();
allTasks.Add(....);
allTasks.Add(....);
Task.WaitAll(allTasks.ToArray(), configuration.CancellationToken);


private static Task<T> HttpClientSendAsync<T>(string url, object data, HttpMethod method, string contentType, CancellationToken token)
{
    HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url);
    HttpClient httpClient = new HttpClient();
    httpClient.Timeout = new TimeSpan(Constants.TimeOut);

    if (data != null)
    {
        byte[] byteArray = Encoding.ASCII.GetBytes(Helper.ToJSON(data));
        MemoryStream memoryStream = new MemoryStream(byteArray);
        httpRequestMessage.Content = new StringContent(new StreamReader(memoryStream).ReadToEnd(), Encoding.UTF8, contentType);
    }

    return httpClient.SendAsync(httpRequestMessage).ContinueWith(task =>
    {
        var response = task.Result;
        return response.Content.ReadAsStringAsync().ContinueWith(stringTask =>
        {
            var json = stringTask.Result;
            return Helper.FromJSON<T>(json);
        });
    }).Unwrap();
}

当前回答

我使用了一个简单的调用,而不是异步。当我添加等待和使方法异步开始工作良好。

public async Task<T> ExecuteScalarAsync<T>(string query, object parameter = null, CommandType commandType = CommandType.Text) where T : IConvertible
        {
            using (IDbConnection db = new SqlConnection(_con))
            {
                return await db.ExecuteScalarAsync<T>(query, parameter, null, null, commandType);
            }
        }

其他回答

另一个原因可能是,如果你正在运行服务(API),并在服务中放置了一个断点(并且你的代码被卡在某个断点上(例如Visual Studio解决方案显示的是调试而不是运行)。然后从客户端代码中点击API。所以如果服务代码在某个断点上暂停,你只需在VS中按F5。

在我的情况下,控制器方法不是异步的,控制器方法内部调用的方法是异步的。

所以我认为使用async/await来避免这些问题是很重要的。

另一种可能是客户端没有等待结果。如果调用堆栈上的任何一个方法没有使用await关键字来等待调用完成,就会发生这种情况。

我使用了一个简单的调用,而不是异步。当我添加等待和使方法异步开始工作良好。

public async Task<T> ExecuteScalarAsync<T>(string query, object parameter = null, CommandType commandType = CommandType.Text) where T : IConvertible
        {
            using (IDbConnection db = new SqlConnection(_con))
            {
                return await db.ExecuteScalarAsync<T>(query, parameter, null, null, commandType);
            }
        }
var clientHttp = new HttpClient();
clientHttp.Timeout = TimeSpan.FromMinutes(30);

以上是等待大请求的最佳方法。 你对30分钟感到困惑;时间是随机的,你可以给出任何你想要的时间。

换句话说,如果请求在30分钟前得到结果,就不会等待30分钟。 30分钟意味着请求处理时间为30分钟。 当我们发生错误“任务被取消”,或大数据请求需求。