5

スレッドとバックグラウンドワーカーの使用方法は知っていますが、「静的」な方法でしか使用できません(ハードコーディングしています)。しかし、私はこのようなものを使いたい

public static void StartThread(string _Method)
{
    Thread t = new Thread(() => _Method;
    t.Start();
}

文字列であるため、これが失敗することはわかっ_Methodています。using を読んだことdelegatesがありますが、これがどのように機能するのか、この場合に必要かどうかはわかりません。

必要なときに特定の関数のスレッドを開始したい (スレッドを動的に作成する)。

4

4 に答える 4

8

異なるスレッドで作業を分割したい場合は、まさに必要なC#タスクを使用できます。それ以外の場合は、Vladの回答にとどまり、代理人を受け入れる方法を使用してください。

タスク

Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));

スレッド

public static Thread Start(Action action) {
    Thread thread = new Thread(() => { action(); });
    thread.Start();
    return thread;
}

// Usage
Thread t = Start(() => { ... });
// You can cancel or join the thread here

// Or use a method
Start(new Action(MyMethodToStart));
于 2012-04-25T09:54:13.287 に答える
3

動的スレッドを作成するには、実行時にそれらを作成する必要があります。この例では、メソッドを作成してスレッドのリストに追加するメソッドCreateThreadsを作成しました。後で、すべてのスレッドを開始するためのメソッドStartMyThreadsがあります。これがあなたの望むものであることを願っています。

    List<Thread> lstThreads = new List<Thread>();
    public void CreateThreads()
    {
        Thread th = new Thread(() => { MyThreadFun(); });
        lstThreads.Add(th);
    }

    private void MyThreadFun()
    {
        Console.WriteLine("Hello");
    }

    private void StartMyThreads()
    {
        foreach (Thread th in lstThreads)
            th.Start();
    }
于 2012-04-25T09:57:08.723 に答える
2

次の方法で実行できます。

public static void StartThread(string s)
{
    Thread t = new Thread(() => { Console.WriteLine(s); });
    t.Start();
}

または、外部からメソッドを設定する場合:

public static void StartThread(Action p)
{
    Thread t = new Thread(p);
    t.Start();
}

...
StartThread(() => { Console.WriteLine("hello world"); });

編集:
確かに、あなたは実際に必要です

public static void StartThread(Action p)
{
    Thread t = new Thread(new ThreadStart(p));
    t.Start();
}
于 2012-04-25T09:51:38.067 に答える
1
var thread = new Thread(
    (ThreadStart)delegate
        {
            Console.WriteLine("test");
        });

また

var thread = new Thread(
    (ParameterizedThreadStart)delegate(object parameter)
        {
            Console.WriteLine(parameter);
        });

TPLタスクを使用する場合は、TPLがThreadPoolスレッドを使用するため、手動で作成したものと比較して違いが生じる場合があることに注意してくださいThread。したがって、ドキュメントを読み、そのような決定を行うときに何をするかを確実に理解してください。

あなたはこれが役に立つと思うかもしれません:専用スレッドまたはスレッドプールスレッド?

于 2012-04-25T10:04:33.003 に答える