programing

BackgroundWorker가 개체를 반환하도록하는 방법

goodcopy 2021. 1. 18. 22:04
반응형

BackgroundWorker가 개체를 반환하도록하는 방법


RunWorkerAsync()반환 해야 합니다 List<FileInfo>. 백그라운드 워커에서 객체를 반환하려면 어떻게해야합니까?


에 대한 DoWork이벤트 처리기 BackgroundWorker(백그라운드 작업이 발생하는 위치)에는 인수가 DoWorkEventArgs있습니다. 이 개체에는 공용 속성 개체 Result가 있습니다. 작업자가 결과 (귀하의 경우 a List<FileInfo>)를 생성하면이를 설정 e.Result하고 반환합니다.

이제 BackgroundWorker가 작업을 완료 했으므로 개체가 인수로있는 RunWorkerCompleted이벤트를 트리거합니다 RunWorkerCompletedEventArgs. RunWorkerCompletedEventArgs.Result의 결과가 포함됩니다 BackgroundWorker.

예:

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    int result = 2+2;
    e.Result = result;
}

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    int result = (int)e.Result;
    MessageBox.Show("Result received: " + result.ToString());
}

나는 당신이 차단하고 결과를 위해 RunWorkerAsync ()를 기다리고 싶지 않다고 가정하고 있습니다 (그렇다면 비동기를 실행할 이유가 없을 것입니다!

백그라운드 프로세스가 완료 될 때 알림을 받으려면 RunWorkerCompleted 이벤트를 연결합니다. 일부 상태를 반환하려면 DoWork 이벤트 인수의 Result 멤버에 반환합니다.

편집 : 조기 게시-코드 예제 완료

예:



    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      // do your thing
      ....
      // return results
      e.Result = theResultObject;
    }

    // now get your results
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      MyResultObject result = (MyResultObject)e.Result;
      // process your result...
    }



RunWorkerAsync()프로세스를 비동기 적으로 시작하고 프로세스가 실제로 완료되기 전에 코드를 반환하고 계속 실행합니다. 의 결과를 얻으려면 BackgroundWorker해당 값을 유지할 인스턴스 변수를 만들고 BackgroundWorker완료되면 확인해야합니다 .

작업이 완료 될 때까지 기다리려면 BackgroundWorker.


스레드가 객체를 인수로 사용하여 이벤트를 발생 시키도록 할 수 있습니다.

ThreadFinishedEvent(this, new ThreadEventArgs(object));

어디:

public class ThreadEventArgs : EventArgs
{
    public ThreadEventArgs(object object)
    {
        Object = object
    }

    public object Object
    {
        get; private set;
    }
}

Depending on your model, you either want to have your worker thread call back to its creator (or to some other process) when it's finished its work, or you have to poll the worker thread every so often to see if it's done and, if so, get the result.

The idea of waiting for a worker thread to return its result undermines the benefits of multithreading.


Generally speaking when running a process async, The worker thread should call a delegate or fire an event (like ChrisF).

You can check out the new PFX which has some concurrency function that can return values.

For example there is a function called Parallel.ForEach() which has an overload that can return a value.

check this out for more info

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx

ReferenceURL : https://stackoverflow.com/questions/939635/how-to-make-backgroundworker-return-an-object

반응형