好吧,我现在已经有一段时间了,我决定只使用线程。我正在制作语法高亮显示,但我通常会使用通常用于的文件大小来获得可怕的性能。所以我做了两个表单,第一个用纯文本显示文件,当你点击我开始一个新线程时,有一个按钮显示“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行着色时发回一条消息。然后我将接受并找出进度并将其显示给用户。
我怎样才能将信息或事件(......我可以这样做)发送到我的第一张表格,让它知道其他人的进展吗?
答案 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的内容,抱歉。