0

我想让一个代表可供整个班级使用。这样做的目的是允许来自外部类的 backgroundWorker 的调用方法通过它的所有方法(ExternalClass.Run();调用 ExternalClass.Method2();ExternalClass.Method3();等等,它们都需要发送几个进度报告。必须不断地通过委托似乎效率低下。

我尝试全局初始化委托的实例并将其设置为等于 Run() 中传递的实例;然后每种方法都可以使用,但我收到一个错误,即无法隐式转换空对象。

谢谢!

我无法显示我正在使用的代码,因为我目前没有它(它在我的笔记本电脑上),但我现在会尝试更好地解释。伪代码:

class form1 : form {
    backgroundWorker_doWork()
    {
        Class2.Run();
    }

    backgroundWorker_OnProgressChange()
    {
         // do this
    }

}


class class2{
     Run(){
     OtherMethod();ThirdMethod();
     }

     OtherMethod(){ //need to call backgroundWorker.ReportProcess(int, string)}
     ThirdMethod(){ //need to call backgroundWorker.ReportProcess(int, string)}
} 

我真的不想每次都通过它是重点,我想以某种方式将它传递给class2

4

2 回答 2

4

您应该显示您的代码不起作用以及确切的错误消息。应该没问题 - 这是一个例子:

using System;

class Demo
{
    private readonly Action action;

    public Demo(Action action)
    {
        this.action = action;
    }

    public void FirstMethod()
    {
        Console.WriteLine("In first method");
        action();
    }

    public void SecondMethod()
    {
        Console.WriteLine("In second method");
        action();
    }
}

class Test
{
    static void Main()
    {
        Demo demo = new Demo(() => Console.WriteLine("Action called"));

        demo.FirstMethod();
        demo.SecondMethod();
    }
}
于 2009-08-20T20:14:18.763 回答
0

您可以使用 backgroundWorker 中的 InvokeMethod 函数来允许工作人员执行任何委托,例如下面的示例(也等待调用完成,您可能不需要):

BackgroundWorker 函数 (C++.net)

BackgroundWorkerFunction()
{
::IAsyncResult ^ThreadResult;

SetTileCount_Delegate ^SetCountDel = gcnew SetTileCount_Delegate(this, &PartDetail::SetTileCount_Function);

//RecordingContainer is the class I am invoking into
ThreadResult = this->RecordingContainer->BeginInvoke(
   SetCountDel, ThisTest->RecordingsCache->Count);

WaitForInvokeTimeOutOrCompletion(ThreadResult);
}




System::Void WaitForInvokeTimeOutOrCompletion(IAsyncResult ^ThreadResult)
{
   if(ThreadResult == nullptr) return;

   long SleepTotal = 0;
   long SleepInterval = 100;

    while ((SleepTotal <= 2000) && !ThreadResult->IsCompleted) 
    {
       ThreadResult->AsyncWaitHandle->WaitOne(SleepInterval, false);
       SleepTotal += SleepInterval;
    }
}
于 2009-08-27T14:34:11.050 回答