【发布时间】:2018-08-18 15:25:06
【问题描述】:
尝试在单独的类中调用 OnProgressChanged 和 OnCheckCancel 时出现非静态字段错误需要对象引用。这是一个简单的语法错误,但我无法弄清楚。
我使用了此链接中的代码:BackgroundWorker cancellation
当搜索引擎代码包含在表单中时,我可以执行代码,但我需要让它和我的类库中的许多其他方法支持后台工作。
//**** Windows Form code (Worker.cs)
public partial class Worker : Form
{
bwSearchEngine bwSE = new bwSearchEngine();
public Worker()
{
InitializeComponent();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
}
private void btnSearch_Click(object sender, EventArgs e)
{
// set arguments
bw.RunWorkerAsync(arguments);
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
bwSE.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage, pe.UserState);
bwSE.CheckCancel += (sender1, e1) => e1.Cancel = worker.CancellationPending;
e.Result = Search();
}
}
//**** Engine code (bwSearchEngine.cs)
public event ProgressChangedEventHandler ProgressChanged;
public event EventHandler<CancelEventArgs> CheckCancel;
protected virtual void OnProgressChanged(int progress, string message)
{
if (ProgressChanged != null)
{
ProgressChanged(this, new ProgressChangedEventArgs(progress, message));
}
}
protected virtual bool OnCheckCancel()
{
EventHandler<CancelEventArgs> handler = CheckCancel;
if (handler != null)
{
CancelEventArgs e = new CancelEventArgs();
handler(this, e);
return e.Cancel;
}
return false;
}
public class Extensions
{
public static List<HookSet> get_Extensions(string word, SQLiteDataSet hayfield)
{
foreach (DataRow dr ...)
{
// Do processing
if (results.Count > 0 && results.Count % 100 == 0)
{
OnProgressChanged(0, results.Count.ToString()); // ERROR ERROR
if (OnCheckCancel()) // ERROR ERROR
{
break;
}
}
}
}
return (results);
}
【问题讨论】:
-
OnProgressChanged 是在类 bwSearchEngine 中定义的事件,如果不使用bwSearchEngine 类。
-
新建一个公共静态类,两个事件可以写入数据。其他类可以读取数据。我通常创建一个状态类,而不是让事件进行更改,然后将其传递给后台工作程序,以便代码可以更改值而不是事件。
-
Extensions 类是 bwSearchEngine 的子类,因此可以访问。
标签: c# .net backgroundworker