2011-03-06 133 views
0

這是我如何創建一個線程,它domething reps次溝通:與另一個線程

protected virtual void RedButtonClicked(object sender, System.EventArgs e) 
{ 
    Nuker n = new Nuker(target, reps); 
    bombThread = new Thread(new ThreadStart(n.nuke)); 
    bombThread.Start(); 
} 

Thread類:

public class Nuker 
{ 
    private string target; 
    private int reps; 
    //... 
    public void nuke() 
    { 
     for(int i=0; i<reps; ++i) 
     { 
      ICBM.nuke(target); 
      Thread.Sleep(5500); 
     } 
    System.Console.WriteLine("Done."); 
    } 
} 

(我創建了一個新的類來存儲,因爲我的一些變量不能通過這些在ThreadStart()。)

現在我想有一個簡單的可視化的過程,讓我們說打印當前重複的文字在窗體上的字段。我將如何使用循環中的i來做到這一點?

回答

0

你可以用一個BackgroundWorker做到這一點,it's :-) 最簡單的一個線程下面我發佈你的樣品,我有createt教一些朋友使用BackgroundWorker的;-)

private BackgroundWorker bw = new BackgroundWorker(); 

public Form1() 
{ 
    InitializeComponent(); 
    bw.WorkerReportsProgress = true; 
    bw.WorkerSupportsCancellation = true; 
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
} 

public void buttonStart_Click(object sender, EventArgs e) 
{ 
    if (bw.IsBusy != true) 
     bw.RunWorkerAsync(12); //Start 
} 

public int Pils(int i) 
{ 
    Thread.Sleep(2000); 
    bw.ReportProgress(70, "In the middle of the work.."); 
    Thread.Sleep(2000); 
    bw.ReportProgress(90, "Returning the result.."); 
    Thread.Sleep(2000); 
    return (2 * i); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    bw.ReportProgress(20, "Waiting for cancel.."); 
    Thread.Sleep(2000); 
    if ((bw.CancellationPending == true)) 
     e.Cancel = true; 
    else 
    { 
     bw.ReportProgress(50, "Starting process.."); 
     e.Result = Pils((int)e.Argument); 
    } 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    bw.ReportProgress(100, "Work done.."); 
    if ((e.Cancelled == true)) 
     textBox1.Text = "Canceled!"; 
    else if (e.Error != null) 
     textBox1.Text = ("Error: " + e.Error.Message); 
    else textBox1.Text = e.Result.ToString(); 
} 

private void buttonCancel_Click(object sender, EventArgs e) 
{ 
    if (bw.WorkerSupportsCancellation == true) 
     bw.CancelAsync(); 
} 

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    listBox1.Items.Add((e.ProgressPercentage.ToString() + "%") + " - " + e.UserState as String); 
} 

網址博客帖子:link

0

在最簡單的形式,你證明了在Nuker類回調

公共Nuker(目標字符串,整數代表,行動reportCallback){..}

在循環中你只需要調用reportCallback(i);

Nuker n = new Nuker(target, reps, ReportMethod); 

private void ReportMethod(int currentIdx) 
{ 
    if (InvokeRequired) // Invoke if UI update 
    ... 
} 

但是,可能要使用具有建立在報告了UI線程上的進步方法BackgroundWorker。只需檢查MSDN上的示例。