4

私のWindowsフォームアプリケーションには、バックグラウンドワーカーを拡張するクラスがあります。フォームクラスでExtendedBGW1.csと呼びましょう。メンバー変数のように宣言するので、次のようにクラス全体のスコープを持ちます。

public partial class Main : Form
{
    ExtendedBGW1 ebgw1;
}

後でフォームコンストラクターでこれを行います

public Main()
{
    InitializeComponent();

    ebgw1 = new ExtendedBGW1();

    InitializeBackgoundWorker();
}

私の InitializeBackgroundWoker() メソッドは次のようになります

private void InitializeBackgoundWorker()
{
    ebgw1.DoWork += new DoWorkEventHandler(ebgw1.worker_DoWork);
    ebgw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(processWorkerCompleted);
    ebgw1.ProgressChanged += new ProgressChangedEventHandler(processProgressChanged);
    ebgw1.WorkerReportsProgress = true;
    ebgw1.WorkerSupportsCancellation = true;
}

今度は私のデザインの問題です。BackGroundWorker を拡張する extensedBGW1.cs のようなさまざまなクラスが必要になることがわかったので、IExtenedBackGroundWorker を作成すると、このようなことができると考えていました。

public partial class Main : Form
{
    IExtenedBackGroundWorker ebgw1;
}

Main クラスの適切なスコープはまだあります。次に、後で必要になる IExtendedBackGroundWorker の実装を作成するだけです。

メソッドとプロパティのインターフェイスは問題なく作成できますが、基本クラスとメイン クラスのインターフェイスの間でイベントを正しく接続しようとすると、実際に問題が発生します。

誰にもアイデアはありますか?

メインで発生するエラーは次のとおりです

Error   1   Cannot assign to 'DoWork' because it is a 'method group'

インターフェイスの実装で発生するエラーは次のとおりです

Error   5   The event 'System.ComponentModel.BackgroundWorker.DoWork' can only appear on the left hand side of += or -= 

これが私のインターフェースが今どのように見えるかです:

interface IExtendedBackGroundWorker 
{
    bool IsBusy { get; }

    bool WorkerReportsProgress { get; set; }

    bool WorkerSupportsCancellation { get; set; }

    List<CompareObject> ObjList { get; set; }

    string FilePath { get; set; }

    void RunWorkerAsync();

    void CancelAsync();

    void DoWork();

    void worker_DoWork(object sender, DoWorkEventArgs e);

    void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e);

    void ProgressChanged(object sender, ProgressChangedEventArgs e);
}
4

1 に答える 1

10

簡単、ただ 1 - 2 - 3 - 完了

public interface IMyWorker
{
    bool WorkerReportsProgress { get; set; }
    bool WorkerSupportsCancellation { get; set; }
    event DoWorkEventHandler DoWork;
    event ProgressChangedEventHandler ProgressChanged;
    event RunWorkerCompletedEventHandler RunWorkerCompleted;
}

public class MyWorker : BackgroundWorker, IMyWorker
{

}

使用法:

namespace stackOverflow
{
class Program
{
    static void Main(string[] args)
    {
        IMyWorker worker = new MyWorker();
        worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
    }

    static void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        throw new NotImplementedException();
    }
  }
}

楽しむ :)

于 2009-05-11T13:54:13.153 に答える