2015-06-10 26 views
-2

我正在停止線程沒有任何作品。 我嘗試了100種方法。 有什麼不對? 這很刺激c#簡單任務取消

(我必須在這裏寫一些文字,因爲stackoverflow.com不允許我發送這篇文章)(我必須在這裏寫一些文字,因爲stackoverflow.com不允許我發送這個後)(我在這裏寫一些文字,因爲stackoverflow.com不允許我發這個帖子)

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication5 
{ 
    public partial class Form1 : Form 
    { 
     private static CancellationTokenSource cts = new CancellationTokenSource(); 
     private CancellationToken ct = cts.Token; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Task.Factory.StartNew(() => 
      { 
       work_for_task(ct); 
      }, this.ct); 
     } 

     private void work_for_task(CancellationToken ct) 
     { 
      if (ct.IsCancellationRequested) 
      { 
       ct.ThrowIfCancellationRequested(); 
      } 

      for (int i = 0; i < 5; i++) 
      { 
       if (richTextBox2.InvokeRequired) 
       { 
        richTextBox2.Invoke((MethodInvoker)delegate 
        { 
         richTextBox2.AppendText("I AM IN: " + Thread.CurrentThread.Name + "\n"); 
        }); 

        Thread.Sleep(1400); 
       } 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("CANCELED"); 
      cts.Cancel(); 
     } 
    } 
} 
+3

你只檢查任務取消*一次* - 您應該在每次迭代中檢查它循環的重刑。另外,你應該把*有用的*文本放在那裏,而不是用假文本填充你的文章。您發佈的任何文本都不能解釋您想要實現的內容的全貌,或者您嘗試的代碼超出了您提供的代碼或發生了什麼。 –

+0

你有權利......這是沒有道理的......我在學習,有時我犯了一些愚蠢的錯誤。謝謝 – mtoy

+1

@mtoy所以然後請接受我的答案,如果它幫助你... – cramopy

回答

1

只是這不是你的work_for_task方法:

private void work_for_task(CancellationToken ct) 
{ 
    for (int i = 0; i < 5; i++) 
    { 
     if (ct.IsCancellationRequested) 
     { 
      return; 
     } 
     if (richTextBox2.InvokeRequired) 
     { 
      richTextBox2.Invoke((MethodInvoker)delegate 
      { 
       richTextBox2.AppendText("I AM IN: " + Thread.CurrentThread.Name + "\n"); 
      }); 

      Thread.Sleep(1400); 
     } 
    } 
} 
+0

有錯誤 - ct.ThrowIfCancellationRequested();我只是使用「返回」線程完成。 Thx – mtoy

+0

您不需要檢查「IsCancellationRequested」或中斷(無法訪問的代碼),只需在循環中調用'ct.ThrowIfCancellationRequested()'。請參閱MSDN的等效代碼部分:https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.throwifcancellationrequested%28v=vs.110%29.aspx此外,因爲'ct'是一個公共類成員,它不要求(或推薦)也將它作爲參數傳遞給方法。 –

+0

@mtoy是啊,你是對的,我修好了!如果它幫助你,請將其標記爲已回答。謝謝! – cramopy