Sam*_*Sam 0 c# multithreading async-await asp.net-core
我有一个Action,可以访问三个Cosmos DB存储库来检索信息.该操作具有以下代码:
var task1 = _itemRepository.RetrieveByIdAsync(id);
var task2 = _partsRepository.RetrieveForItemAsync(id);
var task3 = _purchasesRepository.RetrieveForItemAsync(id, currentUserId);
var userPurchased = await _userPurchaseRepository.HasUserPurchased(Session.UserId) // this is awaited because it is a SQL task and can only execute one at a time
await Task.WhenAll(task1, task2, task3);
Run Code Online (Sandbox Code Playgroud)
我在调试时注意到的是,任务似乎在不同的线程上运行.System.Threading.Thread.CurrentThread.ManagedThreadId与任务运行之前,每个任务以及等待任务之后不同.
输入前的线程ID - 5
项目存储库线程ID - 61
部件存储库线程ID - 5个
购买存储库线程ID - 60
WaitAll后的线程ID - 6
存储库方法最终都调用了一个常见的QueryAsync方法,如下所示:
public async Task<IEnumerable<TDomainObject>> QueryAsync(Expression<Func<TDomainObject, bool>> predicate, FeedOptions options)
{
var query = Client.CreateDocumentQuery<TDomainObject>(Collection.DocumentsLink, options).Where(predicate).AsDocumentQuery();
List<TDomainObject> results = new List<TDomainObject>();
while (query.HasMoreResults)
{
results.AddRange(await query.ExecuteNextAsync<TDomainObject>());
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,同一个请求线程应该用于async/await的所有处理,我担心我的代码可能没有那么高效.
我没有使用线程ID,我只是想确保我没有创建不必要的线程.
编辑:最初让我调查的是我发现方法中的调用堆栈QueryAsync,当指向结果时,调用堆栈在存储库而不是控制器中启动.
任务并行库和async/await功能的全部目的是它们抽象出底层的Threads逻辑.除非您正在使用一个项目,该项目与具有在UI线程上运行的同步上下文的框架(即:WinForms,WPF,Xamarin)一起工作,否则您应该让框架确定给定Task应该在当前线程上运行还是在一个不同的.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |