线程化,让一个线程知道其他人的进展

时间:2012-08-17 18:36:30

标签: c# multithreading textbox

好吧,我现在已经有一段时间了,我决定只使用线程。我正在制作语法高亮显示,但我通常会使用通常用于的文件大小来获得可怕的性能。所以我做了两个表单,第一个用纯文本显示文件,当你点击我开始一个新线程时,有一个按钮显示“openincolor”

    private void button1_Click(object sender, EventArgs e)
    {
        ColoringThread colorer = new ColoringThread(this.m_bruteView.Text);
        Thread theThread = new Thread(new ThreadStart(colorer.OpenColorWindow));
        theThread.Start();
    }

    public class ColoringThread
    {
        string text;
        public ColoringThread(string initText)
        {
            text = initText;
        }
        public void OpenColorWindow()
        {
            Form2 form2 = new Form2(text);
            form2.ShowDialog();
        }
    };

我希望这个表单在每次完成x行着色时发回一条消息。然后我将接受并找出进度并将其显示给用户。

我怎样才能将信息或事件(......我可以这样做)发送到我的第一张表格,让它知道其他人的进展吗?

4 个答案:

答案 0 :(得分:3)

一种非常简单的方法是使用BackgroundWorker。它已提供an event来报告进度。

答案 1 :(得分:2)

这样的事情怎么样?这会向ColoringThread类添加一个事件,该类由调用类订阅。

private void button1_Click(object sender, EventArgs e) {
    ColoringThread colorer = new ColoringThread(this.m_bruteView.Text);
    colorer.HighlightProgressChanged += UpdateProgress;
    Thread theThread = new Thread(new ThreadStart(colorer.OpenColorWindow));
    theThread.Start();
}

private void UpdateProgress(int linesComplete) {
    // update progress bar here
}

public class ColoringThread
{
    string text;

    public delegate void HighlightEventHandler(int linesComplete);
    public event HighlightEventHandler HighlightProgressChanged;

    public ColoringThread(string initText) {
        text = initText;
    }

    public void OpenColorWindow() {
        Form2 form2 = new Form2(text);
        form2.ShowDialog();

        int linesColored = 0;
        foreach (String line in text.Split(Environment.NewLine)) {
            // colorize line here

            // raise event
            if (HighlightProgressChanged != null)
                HighlightProgressChanged(++linesColored);
        }
    }
};

答案 2 :(得分:1)

您可以将一个对象作为参数传递给Thread.Start,并在当前线程和启动线程之间共享您的数据。


这是一个很好的例子: How to share data between different threads In C# using AOP?


或者您可以使用具有ReportProgress

的BackgroundWorker

答案 3 :(得分:1)

您需要的是System.Windows.Threading.Dispatcher的BeginInvoke方法。您无法直接从后台线程修改WPF对象,但是您可以派遣委托来执行此操作。

在派生的Window类对象中,您拥有Property Dispatcher,因此您可以按如下方式使用它:

Dispatcher.BeginInvoke(
  DispatcherPriority.Normal,
  (status) => { StatusTextBox.Text = status },
  thestatus
);

对不起,我目前无法测试,我没有这里的项目,我在那里做了。但我相信它会奏效,祝你好运;)

更新:哎呀,你正在使用Form的...我写了关于WPF的内容,抱歉。