后台工人类和使用来自c#中不同类的进度事件传递消息
所以我有一个类在新的后台工作程序中启动一个新类,后台工作程序使用progresschanged部分传回状态消息。
当我尝试并通过键入使用它
classname.Dataworker.reportprogress(5)
从一个单独的类我得到一个错误,我在定义之前使用一个对象。
我发现的例子都使用了单个类和不同的函数。
这可能是一个愚蠢的容易错误,但我只是看不到它,谢谢你能给予的任何帮助!
我的代码概述如下:
//form class public static BackgroundWorker bw = new BackgroundWorker(); onbuttonclick { installer install = new installer(); bw.WorkerReportsProgress = true; bw.WorkerSupportsCancellation = true; bw.DoWork += class2.aFunction; bw.ProgressChanged += new ProgressChangedEventHandler(mainForm_InstallerEvent); bw.RunWorkerAsync(); } private void mainForm_InstallerEvent(object sender, ProgressChangedEventArgs e) { lbl.Text = e.UserState.ToString(); }
//// class2后台工作者类
aFunction { InstallerForm.bw.ReportProgress(5); //errors on this! }
如果要执行以下操作,则需要使用UserState调用ReportProgress :
lbl.Text = e.UserState.ToString();
然后你的电话会是这样的:
aFunction { InstallerForm.bw.ReportProgress(5, "5% Complete"); }
现在看起来你的e.UserState将为null,并且调用ToString()将导致空引用exception。
以下是UserState是文本的示例。
感谢您的帮助,在这些答案之间我发现我已经设法使其工作,我缺少的是:BackgroundWorker worker =(BackgroundWorker)sender;
然后用worker.reportprogress(..)引用该worker对象
我发现有用的指南是: http : //www.nerdparadise.com/tech/coding/csharp/backgroundworker/
完美,谢谢你们:)
后台工作线程使用ReportProgress将百分比值传递给Progress_Changed委托。 本文向您展示同步和异步的示例。
到目前为止,这是我懒惰的解决方法(因为我不想使用额外的事件处理程序)。 在那个时候我也不想理解用户;)所以我使用了包含所有警报/消息的列表来进行特定的长操作。 消息字符串保存在应用程序中强大的资源存储库App.Properties.Settings
。 由于ReportProgress
采用整数,我将ReportProgress
列表索引发送到Progress_Changed
。
示例:在do_work中调用了以下方法。
private void LongOperation() { try { //the operation if (success){ //write a message to a status label bgWorker.ReportProgress(1); } else{ //write a message to a status label bgWorker.ReportProgress(2); } } catch(){...} } public void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs p) { int lstIndex = p.ProgressPercentage; lblStatus.Text = mssglist[lstIndex].ToString(); }