从公共方法访问backgroundworker

时间:2017-10-18 14:38:31

标签: c# backgroundworker

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

在这个公共方法中

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

我的DoWork位于Form1

我表单中的公共实用程序确实做了很多事情,那么THAT函数需要再次使用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
}
}

更新(根据评论):

刚才提到的Michael comments 将后台工作者以公共方法开头:

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

        }

现在我想从其他方法调用此方法。为了做到这一点,另一个方法(init包)需要知道这个方法在哪里。 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%的积分归功于迈克尔与我一起工作!

2 个答案:

答案 0 :(得分:0)

EDITED!

好的,现在我明白了。您要运行的每个表单都必须实现IWorker接口。然后传递具体的Form以用作RunWorker函数的泛型参数。 where子句仅允许实现IWorker接口 - 它(当前)不限于Form-instances。

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

答案 1 :(得分:-1)

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

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