gpt4 book ai didi

C#多线程结合异步/等待

转载 作者:行者123 更新时间:2023-11-30 20:43:19 24 4
gpt4 key购买 nike

这是另一个与 C# 中的多线程相关的问题。

然而,当多线程与 async/await 结合时似乎很有趣。

我有一个生成线程的方法,它异步调用对象的方法。

但是,不同类的对象不共享上下文。

例如,考虑代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadDataSharing
{
class Data
{
public static ThreadLocal<string> Name = new ThreadLocal<string>();
}

class Locker { public static object lobj = new object { };}
class Program2
{
static void Main(string[] args)
{
for (int i = 0; i < 3; i++)
{
var pObj = new Program();
new Thread(new ThreadStart(pObj.MyThreadMethod)).Start();
}
}
}
class Program
{

///my async method
///
public async Task MyAsyncMethod()
{
lock (Locker.lobj)
{
Console.WriteLine("From async method");
Console.WriteLine("thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("id: " + Data.Name.Value);
}

await MyAsyncMethod2();

await new AsyncClass().AsyncMethod();
}

public async Task MyAsyncMethod2()
{
lock (Locker.lobj)
{
Console.WriteLine("From async 2 method");
Console.WriteLine("thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("id: " + Data.Name.Value);
}

await Task.Run(() =>
{
lock (Locker.lobj)
{
Console.WriteLine("From task run method");
Console.WriteLine("thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("id: " + Data.Name.Value);
}
});
}

public void MyThreadMethod()
{
lock (Locker.lobj)
{
Console.WriteLine("From thread method");
Console.WriteLine("thread: " + Thread.CurrentThread.ManagedThreadId);

var id = Guid.NewGuid();
Data.Name.Value = id.ToString();
Console.WriteLine("id: " + Data.Name.Value);
}

MyAsyncMethod().Wait();
}
}


public class AsyncClass
{
public async Task AsyncMethod()
{
lock (Locker.lobj)
{
Console.WriteLine("From class async method");
Console.WriteLine("thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("id: " + Data.Name.Value);
}

var newId = Guid.NewGuid();
Data.Name.Value = newId.ToString();

await AsyncMethod2();
}

public async Task AsyncMethod2()
{
lock (Locker.lobj)
{
Console.WriteLine("From class async 2 method");
Console.WriteLine("thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("id: " + Data.Name.Value);
}

await Task.Run(() => { });
}
}

}

运行这段代码会在我的机器上产生以下输出

From thread method
thread: 3
id: 3a7ef8e3-ebe1-49e1-94bb-798358ac1567
From thread method
thread: 4
id: 341d3371-f905-4e1c-aac3-47bda16c8d88
From thread method
thread: 5
id: b7e79901-81b7-430f-b158-59f091e43a0c
From async method
thread: 3
id: 3a7ef8e3-ebe1-49e1-94bb-798358ac1567
From async method
thread: 5
id: b7e79901-81b7-430f-b158-59f091e43a0c
From async method
thread: 4
id: 341d3371-f905-4e1c-aac3-47bda16c8d88
From async 2 method
thread: 3
id: 3a7ef8e3-ebe1-49e1-94bb-798358ac1567
From async 2 method
thread: 4
id: 341d3371-f905-4e1c-aac3-47bda16c8d88
From async 2 method
thread: 5
id: b7e79901-81b7-430f-b158-59f091e43a0c
From task run method
thread: 6
id:
From task run method
thread: 8
id:
From task run method
thread: 7
id:
From class async method
thread: 7
id:
From class async method
thread: 6
id:
From class async method
thread: 8
id:
From class async 2 method
thread: 8
id: f52ed654-0e55-4906-bfc1-65c6b25a7785
From class async 2 method
thread: 7
id: 1e53e03b-a3a0-4296-8622-7716b45d1462
From class async 2 method
thread: 6
id: 1adca81d-b11a-4860-b37d-a017afe877b8

问题是,为什么不共享 ThreadLocal<T>对象与第二个类 ( AsyncClass ) 的实例?

最佳答案

在带有 await/async 的控制台应用程序中,没有共享的同步上下文,这可能是它不共享的原因。

关于C#多线程结合异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30673165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com