从 public 方法访问 backgroundworker
access backgroundworker from a public method
所以我有 form1
,它有 backgroundworker(通过设计视图拖放)。
我可以让它在我需要的地方工作,但是我需要从 public 方法调用它。
在这个public方法中
Utility.initpacks(object sender, EventArgs e,string formname)
所以我的 DoWork
在 Form1
.
我在表单中的 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();
}
所以我有 form1
,它有 backgroundworker(通过设计视图拖放)。
我可以让它在我需要的地方工作,但是我需要从 public 方法调用它。
在这个public方法中
Utility.initpacks(object sender, EventArgs e,string formname)
所以我的 DoWork
在 Form1
.
我在表单中的 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();
}