그래서 내가 backgroundworker (끌어 놓기 디자인보기를 통해) form1
있습니다. 필자는 필요한 곳에서 작동하도록 할 수 있지만 공용 메서드에서 호출해야합니다.공용 메서드에서 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) :
마이클 퍼블릭 방식으로 시작하는 백그라운드 작업자를 배치하기 위해 방금 언급 한 내용 :
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")
}
또 다른 업데이 트를! .. 나는 다음 시도 havent 한
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 % 신용 나와 함께이 작업을 위해 마이클에 간다!
방금 방법 사용 (Backgroundworker BGW)에 대한 인수가 가능합니까? BGW.runasync()는 다른 폼에서 해당 배경 작업자의 dowork 부분을 실행합니까? –
나는 당신이하고 싶은 것을 정말로 이해하지 못한다. 그러나'Form'의 일부가 아닌 외부 메쏘드에서'BackgroundWorker'를 시작하기를 원한다면 그것을 할 수있는 많은 방법이 없습니다 : 1)'BackgroundWorker' 그 폼의 public 멤버 (나쁜) 2)'backgroundWorker.RunAsync'를 실행하는 폼에 public 메소드를 추가하십시오.'BackgroundWorker'의'Busy' 상태를 반드시 확인하십시오. 두 변종은 일부 인터페이스로 추상화 될 수 있거나 추상화되어야 할 수 있습니다. – Michael
감사합니다. Michael, 저는 두 번째 옵션으로 작업하고있었습니다. 나는 backgroundworker.runasync를 public 메서드 내에서 사용할 수 있습니다.하지만 다른 공개 메서드 (public method)로 전달하는 방법은 무엇입니까? 폼 객체를 메소드의 소유자로 arguament로 보냅니 까? –