0
public partial class MainWindow : window
{
    private Thread t = new Thread;

    private void btnSend_Click(object sender, RoutedEventArgs e)
    {
        if (t != null)
        {
            if (t.IsAlive == true)
            {
                t.Abort();
                t = null; //Is this correct? should I free this before making null?
                return;
            }

            t = new Thread(send.Image);
            t.Start();    
        }
    }
}

上記のコードは、イベントハンドラーを示しています。「送信」というボタンを押すと、新しいプロセスが作成されます。同じボタンをクリックすると、プロセスが停止するはずです。次に、もう一度[送信]を押すと、プロセスが再開されます。スレッドは同じオブジェクト't'で作成する必要があります。

4

2 に答える 2

1

技術的には問題ありませんが、次のようにする必要があります。

private Thread t; // initially null
private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    if (t != null) 
    { 
        t.Abort(); 
        t = null;
    }
    else
    {
        t = new Thread(send.Image); 
        t.Start();     
    } 
} 

また、を呼び出すのはおそらく良い設計ではありませんAbort

代わりに、 WaitHandleを周期的にチェックする方法でスレッドメソッドを実装することもできます。これにより、スレッドは制御された方法で終了できます。

private Thread t; // initially null
private AutoResetEvent waitHandle = new AutoResetEvent(false);

private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    if (t != null) 
    { 
        waitHandle.Set(); // signal thread termination
        t = null;
    }
    else
    {
        t = new Thread(ThreadMethod); 
        t.Start();     
    } 
} 

private void ThreadMethod()
{
    TimeSpan waitTime = TimeSpan.FromSeconds(1);
    while (!waitHandle.WaitOne(waitTime))
    {
        // do something
    }
}
于 2012-04-04T09:14:02.577 に答える
1

Thread を逆参照する利点は、GC が Thread クラスが保持するすべてのデータを収集できるようにすることですが、Abort を呼び出すとスレッドを完全に停止します。スレッド クラスは IDisposable を実装していないため、クラスが保持するアンマネージ リソースを決定論的に解放する方法はありません。Abort がそれを行うことを願っています。

Thread クラスはかなり軽量であり、多数の MainWindows を同時に実行していない限り、おそらくメモリ消費に影響を与えることはありません。ただし、オブジェクトを二度と使用しないことがわかっている場合は、オブジェクトを逆参照することをお勧めします。

于 2012-04-04T08:58:58.053 に答える