从公开的方法访问backgroundworker

问题描述:

所以我有form1其中有backgroundworker(通过设计视图拖放)。 我可以让它在我需要的地方工作,但是我需要从公共方法中调用它。从公开的方法访问backgroundworker

在这种公共方法

Utility.initpacks(object sender, EventArgs e,string formname) 

所以我DoWorkForm1

我在表单中的公用事业做了一堆事情,然后该功能需要再次使用Form1中的后台工作者!

我可以只是复制公共方法,并放在方法引用的地方,一切都很好......但是这打败了公共方法的目的不是吗?

任何想法将是巨大的感谢:)

编辑:

所以我的当前设置(不一堆东西并不重要):

public partial class frmimportinstitutions : Form 
    { 
    private void btnNext_Click(object sender, EventArgs e) 
     { 
     Utility.initpacks(sender, e, this.FindForm().Name); 
     } 




    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      //Do stuff 

     } 
} 

public static class Utility 
    { 
public static void initpacks(object sender, EventArgs e,string formname) 
     { 
//I WANT TO USE THE BACKGROUND WORKER HERE 
//Do a public method 
//I want to stop the background worker here 
} 
} 

更新(在评论BASD):

Michael 评论刚才提到要把公开的方法启动的后台工作者:

public void startplash(string starttext) 
     { 
      if (!backgroundWorker1.IsBusy) 
      { 
       splashtext = starttext; 
       backgroundWorker1.RunWorkerAsync(); 
      } 

     } 

现在我想从其他方法调用此方法。为了做到这一点,另一种方法(初始包)需要知道这个方法在哪里。 EG。

form1.startsplash("hello world") 

所以,现在我只需要发送Form1中的信息来初始化包...

这会是好的:

Initpacks(Form Owner) 
{ 
Owner.startsplash("hello world") 
} 

另一个更新! 感谢迈克尔,我们到目前为止有这样的:

public static class Utility 
{ 
    public static void RunWorkerOfForm1() 
    { 
     var target = (Form1)Application.OpenForms.OfType<Form1>().FirstOrDefault(); 
     target?.RunWorker(); 
    } 
} 

现在我需要得到这个不同形式的工作..我还没有尝试以下,但是这就是我要去试下..如果指正我错了:

public static class Utility 
{ 
    public static void RunWorkerOfForm1(Form owner) 
    { 
     var target = (owner)Application.OpenForms.OfType<owner>().FirstOrDefault(); 
     target?.RunWorker(); 
    } 
} 

最后的答案(按照勾选答案) - 但使用我的代码:

public partial class frmholidaypacks : Form, IWorker 
    { 
private void btnextrapacks_Click(object sender, EventArgs e) 
     { 
     Utility.futurepacks<frmholidaypacks>(sender, e, pxid); 
     } 
    } 

public interface IWorker 
    { 
     void startplash(string starttext); 

    } 

public void startplash(string starttext) 
     { 
      if (!backgroundWorker1.IsBusy) 
      { 
       splashtext = starttext; 
       backgroundWorker1.RunWorkerAsync(); 
      } 

     } 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      //Doing work. Using Splashtext string. 

     } 

public static void futurepacks<T>(object sender, EventArgs e, int pxid) where T : IWorker 
     { 
var target = (T)Application.OpenForms.OfType<T>().FirstOrDefault(); 
      target?.startplash("Creating future packs"); 
     } 

100%幸得迈克尔对这个工作跟我来!

+0

我可以只在方法使用(Backgroundworker BGW)的参数..? BGW.runasync()会在另一个表单上运行该后台工作器的dowork部分吗? –

+0

我真的不明白你想做什么,但是如果你想从外部方法启动BackgroundWorker而不是'Form'的一部分,那么没有多少办法可以做到这一点:1)使'BackgroundWorker'该表单的公共成员(坏)2)在运行'backgroundWorker.RunAsync'的表单中添加公共方法 - 确保检查'BackgroundWorker'的'Busy'状态。这两种变体都可以/应该用一些接口抽象出来。 – Michael

+0

好的,谢谢迈克尔,我正在研究第二个选项。我现在在这种形式的公共方法中拥有backgroundworker.runasync,但是如何将其传递给其他公共方法,例如。将表单对象作为所有者发送给方法作为一个说法? –

EDITED!

好的,现在我明白了。您要运行的每种表格都必须实现IWorker界面。然后,您通过具体的Form作为RunWorker函数的通用参数。 where子句只允许IWorker接口的实现 - 它(当前)不限于Form实例。

public partial class Form2 : Form, IWorker 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public void RunWorker() 
    { 
     if (backgroundWorker1.IsBusy) return; 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     UtilityX.RunWorker<Form2>(); 
    } 
} 

public static class UtilityX 
{ 
    public static void RunWorker<T>() where T : IWorker 
    { 
     var target = (T)Application.OpenForms.OfType<T>().FirstOrDefault(); 
     target?.RunWorker(); 
    } 
} 

public interface IWorker 
{ 
    void RunWorker(); 
} 
+0

谢谢迈克尔,差不多在那里。在你把它放在那里之前,我得到了你写的东西,最后一个问题是如果form2和form1都需要访问这个RunWorkerOfForm1。例如。 RunworkerofFORM。因为这一点是我有一个工人在3种不同的形式,每个需要运行取决于哪种形式称为initpacks方法 –

+0

@GlennAngel你应该可以用上面的代码。如果另一个表单调用“RunWorkerOfForm1”并且后台工作器已经在运行,会发生什么?如果当前进程被取消,是否应该等到当前运行结束或者...? – Michael

+0

BUt shouldnt this(Form1)Application.OpenForms.OfType ().FirstOrDefault(); be(Form2)Application.OpenForms.OfType ().FirstOrDefault(); –

您是否尝试过使用静态方法 如果您想从多个位置使用静态方法,则可以将其置于静态方法中。

public class MyClass 
    { 
     public static void MyMethod() 
     { 
      //.. 
     } 
    } 
+0

我认为使用EventArgs可能是一个更好的解决方案。 – Aaron

+0

嗨Ehsan,谢谢你的回复。我会在那里放什么?做功能? utility.init包是一个公共静态方法,但在里面我需要调用backgroundworker.RunAsync() –

+0

编辑我的问题并添加我的代码 –