1

私はマルチスレッド技術の使用に非常に慣れていませんが、私が試したことは次のとおりです。

Thread thread = null;

for (int minute = 0; minute < 60; minute++)
{
    Thread.Sleep(60000);

    if (thread != null)
    {
        while (thread.ThreadState == ThreadState.Running) { }
    }

    thread = new Thread(delegate()
    {
        // Do stuff during the next minute whilst the main thread is sleeping.
    });
    thread.Start();
}

ここで達成しようとしているのは、メインスレッドがスリープしている間にスレッドを実行して作業を行うことですが、上記のコードが機能しない理由がわかりません。最初のループ (スレッドの開始後) に続いて、ThreadState が「実行中」から変化していないように見えます。これを行うためのよりエレガントな方法があるかどうかについても興味があります。

誰でも問題を知っていますか?

4

5 に答える 5

4

Thread.Joinは、スレッドが終了するのを待つためのより良い方法です。

于 2012-04-17T04:54:45.920 に答える
2

.Net 4 を使用している場合は、Task Classを参照することをお勧めします。マルチスレッドでの作業がはるかに簡単/簡単になります。

于 2012-04-17T05:02:39.093 に答える
1

クラスを使用すると、Taskこれを行うことができます。

Task task = Task.Factory.StartNew(() =>
  {
    // Do stuff here.
  });

task.Wait();
于 2012-04-17T13:37:12.480 に答える
0

Thread.Sleep(60000) は、それを呼び出したスレッド (この場合はメイン スレッド) で実行されます。これは問題ありませんが、「スレッド」は、それが実行されている時間と実際にいつ停止するかを知りません。オブジェクトが 60 秒間実行されていることを「スレッド」に伝える必要があります。

Thread thread = null;

for (int minute = 0; minute < 60; minute++)
{
    if (thread != null)
    {
        while (thread.ThreadState == ThreadState.Running) { }
    }

    thread = new Thread(delegate()
    {
        try
        {
            // Do stuff during the next minute whilst the main thread is sleeping.
        }
        catch (ThreadAbortException ex)
        {
        }
    });
    thread.Start();
    Thread.Sleep(60000);
    thread.Abort();
}

これはあなたが望むものを達成するはずですが、実際にはスレッドを停止する最もエレガントな方法ではありません. スレッドは、実際にはコールバックを使用して終了する必要があります。

于 2012-04-17T05:01:00.780 に答える
0

あなたが探しているのは、次のようなものです。

Thread thread = new Thread(delegate()
    {
        // Something that takes up to an hour
    });
thread.Start();

for (int minute = 0; minute < 60; minute++)
{
    Thread.Sleep(60000);
    if (thread.IsAlive)
        Console.WriteLine("Still going after {0} minute(s).", minute);
    else
        break; // Finished early!
}

// Check if it's still running
if (thread.IsAlive)
{
    Console.WriteLine("Didn't finish after an hour, something may have screwed up!");
    thread.Abort();
}

これがあなたが探しているものなら、BackgroundWorkerクラスを見てみましょう。

于 2012-04-17T05:08:03.447 に答える