0

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

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

我尝试了这个示例,在这里,线程内的问候变量为空。关于我如何完成这个过程的任何想法。

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;
    }
}
4

3 回答 3

1

该类Thread有一个方法Start(object),您可以使用该方法为线程提供参数,前提是您的线程例程也需要一个参数:

var thr = new Thread(foo);
thr.Start(7);

private void foo(object arg)
{
    int data = (int)arg; // == 7
}

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

var thr = new Thread(_ => foo(7, "Marie", 123.44));
thr.Start();

private void foo(int data, string name, double age)
{
    // ...
}
于 2013-01-21T18:03:26.200 回答
0

您正在一个线程中设置变量并尝试在新线程中读取。我认为你应该使用类似的东西:

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


    private static void Start(object o)
    {
        var greeting = o as string;
        Console.WriteLine(greeting);
    }
于 2013-01-21T17:59:13.093 回答
0

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

您只能从线程内设置线程静态变量。

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

另外,请注意,在 ASP.NET 代码中启动线程通常不是一个好主意

于 2013-01-21T18:00:13.420 回答