从公开的方法访问backgroundworker
所以我有form1
其中有backgroundworker(通过设计视图拖放)。 我可以让它在我需要的地方工作,但是我需要从公共方法中调用它。从公开的方法访问backgroundworker
在这种公共方法
Utility.initpacks(object sender, EventArgs e,string formname)
所以我DoWork
是Form1
。
我在表单中的公用事业做了一堆事情,然后该功能需要再次使用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%幸得迈克尔对这个工作跟我来!
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();
}
谢谢迈克尔,差不多在那里。在你把它放在那里之前,我得到了你写的东西,最后一个问题是如果form2和form1都需要访问这个RunWorkerOfForm1。例如。 RunworkerofFORM。因为这一点是我有一个工人在3种不同的形式,每个需要运行取决于哪种形式称为initpacks方法 –
@GlennAngel你应该可以用上面的代码。如果另一个表单调用“RunWorkerOfForm1”并且后台工作器已经在运行,会发生什么?如果当前进程被取消,是否应该等到当前运行结束或者...? – Michael
BUt shouldnt this(Form1)Application.OpenForms.OfType
您是否尝试过使用静态方法 如果您想从多个位置使用静态方法,则可以将其置于静态方法中。
public class MyClass
{
public static void MyMethod()
{
//..
}
}
我认为使用EventArgs可能是一个更好的解决方案。 – Aaron
嗨Ehsan,谢谢你的回复。我会在那里放什么?做功能? utility.init包是一个公共静态方法,但在里面我需要调用backgroundworker.RunAsync() –
编辑我的问题并添加我的代码 –
我可以只在方法使用(Backgroundworker BGW)的参数..? BGW.runasync()会在另一个表单上运行该后台工作器的dowork部分吗? –
我真的不明白你想做什么,但是如果你想从外部方法启动BackgroundWorker而不是'Form'的一部分,那么没有多少办法可以做到这一点:1)使'BackgroundWorker'该表单的公共成员(坏)2)在运行'backgroundWorker.RunAsync'的表单中添加公共方法 - 确保检查'BackgroundWorker'的'Busy'状态。这两种变体都可以/应该用一些接口抽象出来。 – Michael
好的,谢谢迈克尔,我正在研究第二个选项。我现在在这种形式的公共方法中拥有backgroundworker.runasync,但是如何将其传递给其他公共方法,例如。将表单对象作为所有者发送给方法作为一个说法? –