从 public 方法访问 backgroundworker

access backgroundworker from a public method

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

在这个public方法中

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

所以我的 DoWorkForm1.

我在表单中的 public 实用程序做了很多事情,然后那个函数需要再次使用 Form1 中的后台工作者!

我可以只复制 public 方法并放在方法引用的位置,一切都很好..但这违背了 public 方法的目的,不是吗!?

任何想法都将非常感谢:)

编辑:

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

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
}
}

更新(基于评论):

Michael 评论 刚刚提到将后台工作人员放在 public 方法中启动:

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

        }

现在我想从另一个方法调用这个方法。为了做到这一点,另一个方法(初始化包)需要知道这个方法在哪里。 例如

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% 感谢 Michael 与我合作!

您是否尝试过使用静态方法, 如果您也想在多个地方使用代码,可以将代码放在静态方法中。

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

已编辑!

好的,我明白了。您想要 运行 的每个表单都必须实现 IWorker 接口。然后将具体的 Form 作为通用参数传递给 RunWorker 函数。 where 子句只允许 IWorker 接口的实现 - 它(当前)不限于表单实例。

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();
}