与另一个线程进行通信 [英] Communicating with another thread

查看:124
本文介绍了与另一个线程进行通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这就是我创建一个线程的方式: $ b $ $ $ $ $ $ $ $ $ $ $ $ c $> c $次> $ c> protected virtual void RedButtonClicked(object sender,System.EventArgs e)
{
Nuker n = new Nuker(target,reps);
bombThread = new Thread(new ThreadStart(n.nuke));
bombThread.Start();
}

线程类:

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




$ b

(我创建了一个新类来存储一些变量,因为我无法在 ThreadStart()中传递这些内容。)



现在我想要一个简单的可视化该过程让我们假设在表单上的文本字段中打印当前的重复。我如何使用循环中的 i 来做到这一点?

解决方案

你可以用后台工作,它是最简单的线程之一:-)
以下我已经发布了一个示例,我已经创建了一些示例来教会一些朋友使用backgroundworker; - )

  private BackgroundWorker bw = new BackgroundWorker(); 

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

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

public int Pils(int i)
{
Thread.Sleep(2000);
bw.ReportProgress(70,在工作中......);
Thread.Sleep(2000);
bw.ReportProgress(90,返回结果..);
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 =Cancelled!;
else if(e.Error!= null)
textBox1.Text =(Error:+ e.Error.Message);
else textBox1.Text = e.Result.ToString();

$ b $ 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);
}

到blogpost的网址:链接


This is how I create a thread that does domething reps times:

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

The thread class:

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.");
    }
}

(I create a new class to store some variables since I can't pass these in ThreadStart().)

Now I would like to have a simple visualisation of the process, let's say printing the current repetition in a text field on a form. How would I use the i from the loop to do that?

解决方案

you can do it with a backgroundworker, it´s one of the easiest threads :-) below i have post you a sample that i have createt to teach some friends the use of the 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);
}

url to the blogpost: link

这篇关于与另一个线程进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆