【问题标题】:Background Worker access from separate class来自单独类的后台工作人员访问
【发布时间】: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


【解决方案1】:

我找到了一个(有点不受欢迎的解决方案)。类方法 get_Extensions 是一个静态方法,不能从中调用非静态方法 OnProgressChanged()。如果我将后者设为静态方法,则无法从 BackgroundWorker 向其添加事件。所以,看来我必须让所有相关的东西都变成非静态的,并在使用它之前创建一个类的实例,......直到找到更好的解决方案。

【讨论】:

    【解决方案2】:

    我找到了解决方案。我将 BackgroundWorker 添加为静态方法。我没有在设计模式下将 BackgroundWorker 添加到表单中,而是将其添加到构造函数中,并调整了代码以适应静态 bw。

        private readonly static BackgroundWorker bw = new BackgroundWorker();
    
        public Worker()
        {
            InitializeComponent();
            bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork);
            bw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多