使用自定义数据旋转新线程

本文关键字:线程 新线程 旋转 自定义 数据 | 更新日期: 2023-09-27 17:55:04

我正在尝试完成以下功能,

我得到一个HttpRequest,根据请求,我将创建一个新线程,然后为这个线程设置一些数据[本地和线程特定的数据],然后我将旋转线程。在线程中,我必须能够在线程结束生命之前的任何地方使用我在创建该线程之前初始化的数据。

我尝试了这个示例,在这里,线程内的greeting变量为null。你知道怎么完成这个过程吗?

class Program
{
    [ThreadStatic]
    static string greeting = "Greetings from the current thread";
    static void Main()
    {
        Console.WriteLine(greeting); // prints initial value
        greeting = "Goodbye from the main thread";
        Thread t = new Thread(ThreadMethod);
        t.Start();
        t.Join();
        Console.WriteLine(greeting); // prints the main thread's copy
        Console.ReadKey();
    }
    static void ThreadMethod()
    {
// I am getting  greeting as null inside this thread method.
        Console.WriteLine(greeting); // prints nothing as greeting initialized on main thread
        greeting = "Hello from the second thread"; // only affects the second thread's copy
        Console.WriteLine(greeting);
    }
}

编辑我正在努力完成这样的事情

class ThreadTest
{
    static void Main()
    {
        var tcp = new ThreadContextData();
        Thread t = new Thread(ThreadMethod);
        tcp.SetThreadContext("hi.. from t1");
        t.Start();
        t.Join();
        Thread t2 = new Thread(ThreadMethod);
        tcp.SetThreadContext("hello.. from t2");
        t2.Start();
        t2.Join();
        Console.ReadKey();
    }
    static void ThreadMethod()
    {
        Console.WriteLine(new ThreadContextData().GetThreadContextValue());
    }
}
public class ThreadContextData
{
    static ThreadLocal<string> greeting;
    static ThreadContextData()
    {
        greeting = new ThreadLocal<string>(() => "");
    }
    public void SetThreadContext(string contextValue)
    {
        greeting.Value = contextValue;
    }
    public string GetThreadContextValue()
    {
        return greeting.Value;
    }
    public void ClearThreadContextValue()
    {
        greeting.Value = null;
    }
}

使用自定义数据旋转新线程

Thread类有一个方法Start(object),你可以用它来为线程提供参数,前提是你的线程例程也接受一个参数:

var thr = new Thread(foo);
thr.Start(7);
private void foo(object arg)
{
    int data = (int)arg; // == 7
}

但是,如果您可以访问相对较新的。net平台,则可以使用内联lambdas来减少冗长:

var thr = new Thread(_ => foo(7, "Marie", 123.44));
thr.Start();
private void foo(int data, string name, double age)
{
    // ...
}

您正在一个线程中设置变量,并试图在一个新线程中读取。我认为你应该这样写:


    Thread thread = new Thread(Start);
    thread.Start("greetings from ...");

    private static void Start(object o)
    {
        var greeting = o as string;
        Console.WriteLine(greeting);
    }
 

ThreadStatic意味着每个线程获得它自己版本的变量。因此,在您当前的代码中,说greeting = "Goodbye from the main thread";设置这个变量的主线程版本,而不是您正在运行的线程。

你只能在线程内部设置线程静态变量。

我将把所有需要传递给子线程的状态打包在一个类中,然后在线程启动函数中作为数据传递对该类的引用。

另外,要注意在ASP中启动线程。. NET代码通常是一个坏主意。