【发布时间】:2018-08-27 14:59:48
【问题描述】:
考虑下面的伪代码。我有一个具有 3 个属性的类,每个属性都从不同的方法并行填充。
从不同的线程填充同一个类实例的不同属性是否会遇到麻烦?我设置了一个.net fiddle,它看起来运行良好。
如果此代码会导致线程问题,我应该在填充属性时使用什么方法来锁定 Response 类的特定实例?
class Response {
public string Response1 { get; set; }
public string Response2 { get; set; }
public string Response3 { get; set; }
}
void foo() {
var response = new Response();
var task1 = Task.Run(() => GetResponse1(response));
var task2 = Task.Run(() => GetResponse2(response));
var task3 = Task.Run(() => GetResponse3(response));
Task.WaitAll(task1, task2, task3);
}
void GetResponse1(Response response) {
response.Response1 = fetchSomeValue1();
}
void GetResponse2(Response response) {
response.Response2 = fetchSomeValue2();
}
void GetResponse3(Response response) {
response.Response3 = fetchSomeValue3();
}
【问题讨论】:
-
你期待什么麻烦?
-
@trailmax 线程死锁,线程安全 - 那种性质的东西。
-
任务和线程不是一回事。当您使用 Task 时,它更像是对未来结果的承诺。所以用这些术语思考
-
@FortyTwo 在这种情况下,Task.Run 与 Thread.Start 相同——在功能上它们做同样的事情。
标签: c# .net multithreading