gpt4 book ai didi

c# - 带有 BackgroundWorker 和类对象事件的 WinForms 应用程序

转载 作者:行者123 更新时间:2023-11-30 22:01:54 24 4
gpt4 key购买 nike

我正在开发一个执行大量文件处理的 WinForms 应用程序。此处理是在具有“事件”的多个类对象中完成的,以发布不同类型的消息。一种是正在进行的工作的“状态”,另一种是记录问题或所做更改的“输出”。

我添加了一个 BackgroundWorker 进程并且工作正常,但我看到的唯一通知是 ProgressPercentage。如果我订阅并引发任何类事件,我会得到一个“跨线程操作 ..”,这是可以理解的。实现此目的的最佳方法是什么,以便 winforms 应用程序和非交互式进程也可以使用这些组件?

这是我的 DoWork 现在的样子,但事件导致“跨线程”:

var search = SearchToolFactory.Get(Convert.ToInt32(checkedTypeButton.Tag));

search.RaiseUpdateSearchEvent += new EventHandler<UpdateEventArgs>(search_RaiseUpdateSearchEvent);
search.RaiseUpdateOutputEvent += new EventHandler<UpdateEventArgs>(search_RaiseUpdateOutputEvent);
search.Process(Convert.ToInt32(checkedScopeButton.Tag), txtInput.Text, txtPattern.Text);

这里是 UpdateEventArgs,只是一个传递消息的微笑类:

public class UpdateEventArgs: EventArgs
{
public UpdateEventArgs(string s)
{
update = s;
}
private string update;
public string Update
{
get { return update; }
set { update = value; }
}
}

因此,根据 PMF 的评论,我得到了以下工作:

void search_RaiseUpdateOutputEvent(object sender, UpdateEventArgs e)
{
if (InvokeRequired)
{
this.Invoke( (MethodInvoker)delegate{ txtOutput.Text += e.Update; });
}

}

void search_RaiseUpdateSearchEvent(object sender, UpdateEventArgs e)
{
if (InvokeRequired)
{
this.Invoke((MethodInvoker)delegate { txtSearching.Text = e.Update; });
}

}

但也看到并理解了 Hans Passant 所表达的对结构问题的担忧,以及我的架构存在缺陷并且仍需要额外的工作。

谢谢

双语

最佳答案

BackgroundWorker.ReportProgress() 有一个带有两个 参数的重载。第二个可以是您想要的任何。像代表一样:

    public event EventHandler Foo;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
//...
backgroundWorker1.ReportProgress(0, new Action(() => {
var handler = Foo;
if (handler != null) handler(this, EventArgs.Empty);
}));
//...
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
if (e.UserState != null) ((Action)e.UserState)();
else this.progressBar1.Value = e.ProgressPercentage; // optional
}

关于c# - 带有 BackgroundWorker 和类对象事件的 WinForms 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27366919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com