0

好的,我已经有一段时间了,我决定只使用线程。我正在制作一个语法荧光笔,但是对于通常使用的文件大小,我的性能一直很糟糕。所以我做了两个表格,第一个以纯文本形式显示文件,当你点击我开始一个新线程时,有一个按钮显示“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

4 回答 4

3

一种非常简单的方法是使用BackgroundWorker。它已经提供了一个事件来报告进度。

于 2012-08-17T18:38:53.043 回答
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);
        }
    }
};
于 2012-08-17T18:50:03.887 回答
1

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


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


或者您可以使用具有 ReportProgress 的 BackgroundWorker

于 2012-08-17T18:40:13.160 回答
1

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

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

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

很抱歉,我目前无法对其进行测试,而且我在这里没有项目,我在那里做的。但我相信它会起作用,祝你好运;)

更新:哎呀,你正在使用表单的......我写过关于 WPF 的文章,抱歉。

于 2012-08-17T18:51:21.897 回答