0

私はwinformsプログラミングが初めてで、スレッドを使い始めています。

なんとかスレッドを開始できましたが、キャンセル ボタンをクリックしてスレッドを停止できるようにしたいと考えています。

これまでの私のコードは次のとおりです...

これにより、スレッドが開始されます。

private void btnSessions_Click(object sender, EventArgs e)
{
    Thread downloadThread = new Thread(new ThreadStart(DownloadThread));
    downloadThread.Start();
}

これはスレッドです:

void DownloadThread()
{
     // Do the work
}

これは、スレッドをキャンセルするために使用したいボタンです。

private void btnCancel_Click(object sender, EventArgs e)
{
     // Stop the thread
}

btnCancel_Clickに入力する必要があるものを解決するのを手伝ってくれる人はいますか?

4

3 に答える 3

3

これには、タスクをキャンセルする自然な方法をサポートする Task Parallel Library (TPL) を使用する必要があります。

private CancellationTokenSource _tokenSource2;
private CancellationToken _token;

private void btnSessions_Click(object sender, EventArgs e)
{
    _tokenSource2 = new CancellationTokenSource();
    _token = _tokenSource2.Token;

    Task task = Task.Run(() => DownloadThread(), _token);
}

private void DownloadThread()
{
    while (true)
    {
        //do work

        //cancel if needed
        if (_token.IsCancellationRequested)
        {
            _token.ThrowIfCancellationRequested();
        }
    }
}

private void btnCancel_Click(object sender, EventArgs e)
{
    // Stop the thread
    _tokenSource2.Cancel();
}

タスクのキャンセルの詳細: http://msdn.microsoft.com/en-us/library/dd997396(v=vs.110).aspx

使用すべきではない理由Thread.Abort: Thread.Abort() を使用することの何が問題なのか

于 2013-11-12T13:21:23.007 に答える
2

downloadThread をオブジェクトのフィールドにする必要があります。

Thread downloadThread; 
private void btnSessions_Click(object sender, EventArgs e)
{
     downloadThread = new Thread(new ThreadStart(DownloadThread));
     downloadThread.Start();
}

void DownloadThread()
{
     // Do the work
}

private void btnCancel_Click(object sender, EventArgs e)
{
     downloadThread.Abort();
}

UI 関連の処理には、バックグラウンド ワーカーの方が適しています。

于 2013-11-12T13:15:56.383 に答える
0

Thread特にThread.Abortこのようなタスクには使用しない方がよいでしょう。C# には、スレッドを非表示にする高度な抽象ラッパーがあります。Taskとを使用するだけCancellationTokenです。次に例を示します。

var cts = new CancellationTokenSource(); // define in class
CancellationToken ct = cts.Token;

private void btnSessions_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew(() => DownloadThread(), ct ); // start task
}

private void DownloadThread()
{
    // You need to check this at some point where cancel may occur
    if (ct.IsCancellationRequested)
        ct.ThrowIfCancellationRequested();
}

private void btnCancel_Click(object sender, EventArgs e)
{
    cancelToken.Cancel(false); // cancel task
}

詳細については、msdnを参照してください。

于 2013-11-12T13:20:38.603 に答える