c# - 同时多线程和异步

标签 c# multithreading asynchronous asp.net-web-api

我有以下代码:

myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();
obj1Thread.Join();


myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();
obj2Thread.Join();

据我了解,这段代码将创建 2 个新线程,运行指定的方法,暂停主线程直到这两个线程都完成,然后继续执行。

假设我说的是正确的,到目前为止一切都很好。

接下来我想试试这个:

myObject object1 = null;
Thread obj1Thread = new Thread(async () => { object1 = await _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();
obj1Thread.Join();


myObject object2 = null;
Thread obj2Thread = new Thread(async () => { object2 = await _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();
obj2Thread.Join();

基本上是为每个线程添加 async 和 await。

编译器接受了这个更改,它似乎在本地运行,但是这段代码是否可以,它是否可能给我带来任何问题,例如线程是否会混淆、无法等待、混淆结果等

我对异步有相当好的理解,对多线程也有基本的了解,我想不出有什么理由不可行。

代码在本地运行,但我担心在服务器负载过重的情况下可能会出现本地版本中不存在的问题....

最佳答案

The compiler accepts this change and it seems to run locally, but is this code ok, and is it likely to cause me any problems further down the line, for example will the threads get confused, fail to wait, mix up results etc.

I have a reasonably good understanding of async and a basic understanding of multi threading, and I cannot think of any reason why this would not work.

是的,这段代码会给你带来麻烦。线程没有像您预期的那样等待。你传递的是 async void lambdaThread 构造函数,该线程将在 before它设置 object1/object2 变量。因此,在 Join 之后,这些变量完全有可能保持 null

正确的解决方案,如FCin posted ,就是使用异步并发。 (我在这里避免使用术语“并行”,以减少与 Parallel 类型和任务并行库的混淆)。异步并发使用Task.WhenAll:

// Start both methods concurrently
var task1 = _myService.GetMethod(variable1, variable2);
var task2 = _myService.GetMethod2(variable3, variable4);

// (Asynchronously) wait for them both to complete.
await Task.WhenAll(task1, task2);

// Retrieve results.
myObject object1 = await task1;
myObject object2 = await task2;

关于c# - 同时多线程和异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180685/

相关文章:

java - Android 服务中调度的 AsyncTask 仅正确执行一次

java - 如何使用mongoDb java异步驱动程序插入到mongoDb集合后获取_id

jquery - getJSON 请求返回未定义

node.js - 异步系列未按预期顺序工作

c# - 获取所有下拉列表的选定选项

c# - 模仿 File.Move 如果目的地已经存在

c# - 字符串值不能通过类方法赋值

java - 什么是 "Conventional Techniques"来避免死锁?

c - 仅在 pthread 初始化时发生段错误

c# - 如何使用 SqlBuilder