2017-10-18 4 views
0

그래서 내가 backgroundworker (끌어 놓기 디자인보기를 통해) form1 있습니다. 필자는 필요한 곳에서 작동하도록 할 수 있지만 공용 메서드에서 호출해야합니다.공용 메서드에서 backgroundworker에 액세스

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

이 공용 방법에서

그래서 내 DoWorkForm1입니다.

양식 내의 공용 유틸리티는 여러 가지 일을합니다. 그런 다음이 기능은 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 % 신용 나와 함께이 작업을 위해 마이클에 간다!

+0

방금 ​​방법 사용 (Backgroundworker BGW)에 대한 인수가 가능합니까? BGW.runasync()는 다른 폼에서 해당 배경 작업자의 dowork 부분을 실행합니까? –

+0

나는 당신이하고 싶은 것을 정말로 이해하지 못한다. 그러나'Form'의 일부가 아닌 외부 메쏘드에서'BackgroundWorker'를 시작하기를 원한다면 그것을 할 수있는 많은 방법이 없습니다 : 1)'BackgroundWorker' 그 폼의 public 멤버 (나쁜) 2)'backgroundWorker.RunAsync'를 실행하는 폼에 public 메소드를 추가하십시오.'BackgroundWorker'의'Busy' 상태를 반드시 확인하십시오. 두 변종은 일부 인터페이스로 추상화 될 수 있거나 추상화되어야 할 수 있습니다. – Michael

+0

감사합니다. Michael, 저는 두 번째 옵션으로 작업하고있었습니다. 나는 backgroundworker.runasync를 public 메서드 내에서 사용할 수 있습니다.하지만 다른 공개 메서드 (public method)로 전달하는 방법은 무엇입니까? 폼 객체를 메소드의 소유자로 arguament로 보냅니 까? –

답변

0

EDITED!

좋아, 이제 알았다.실행할 모든 양식은 IWorker 인터페이스를 구현해야합니다. 그런 다음 구체적인 FormRunWorker 함수의 일반 매개 변수로 사용합니다. 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(); 
} 
+0

Michael, 거의 다 왔어. 나는 당신이 거기에두기 전에 당신이 쓴 것을 가지고 있고 마지막 문제는 form2와 form1이 모두이 RunWorkerOfForm1에 접근 할 필요가 있다면 어떻게 될까? 예. 포어 워크 러너. 요점은 내가 3 가지 형태의 작업자가 있고 각 양식이 initpacks 메서드를 호출했는지에 따라 실행해야한다는 것입니다. –

+0

@GlennAngel 위 코드를 사용하여 원하는 것이 무엇인지 알아야합니다. 다른 폼이'RunWorkerOfForm1'을 호출하고 백그라운드 작업자가 이미 실행 중이라면 어떻게 될까요? 현재 프로세스가 취소되어야합니까, 현재 실행이 완료 될 때까지 기다려야합니까 아니면 ...? – Michael

+0

이 (Form1) Application.OpenForms.OfType을 참조하십시오. () .FirstOrDefault(); 수 (Form2) Application.OpenForms.OfType () .FirstOrDefault(); –

-1

정적 메서드를 사용하려고 시도 했습니까? 정적 메서드를 사용하려고 했습니까? 여러 위치에서 너무 많이 사용하려는 경우 코드를 고정 메서드에 넣을 수 있습니다.

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

EventArgs를 사용하는 것이 더 나은 해결책이라고 생각합니다. – Aaron

+0

안녕하세요, Ehsan, 답장을 보내 주셔서 감사합니다. 내가 거기에 무엇을 넣을 까? 일하는 기능? utility.init 팩은 public static 메서드이지만 그 안에 backgroundworker.RunAsync()를 호출해야합니다. –

+0

내 질문을 편집하고 코드를 추가했습니다. –

관련 문제