0

次の機能を実現しようとしていますが、

リクエストに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;
    }
}
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 プラットフォームにアクセスできる場合は、インライン ラムダを使用して詳細度を下げることができます。

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

1つのスレッドで変数を設定し、新しいスレッドで読み込もうとしています。私はあなたが次のようなものを使うべきだと思います:

 
    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 に答える