2013-05-02 3 views
2

У меня есть следующий код в статическом классе:C# BackgoundWorker возвращают значение

public static string ExchangeDataAsync(string request) 
{ 
    BackgroundWorker bgWorker = new BackgroundWorker(); 

    bgWorker.DoWork    += (obj, e) => ExchangeData(request, e); 
    bgWorker.RunWorkerCompleted += (obj, e) => ExchangeCompleted(obj, e); 

    bgWorker.RunWorkerAsync(); 

    // I NEED T0 RETURN DATA HERE 
} 

private static void ExchangeData(string request, DoWorkEventArgs e) 
{ 
    // do some work 
    e.Result = some_result; 
} 

private static void ExchangeCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show(e.Result.ToString()); 
} 

Он работает нормально, и я могу видеть мой результат в методе ExchangeCompleted. Но как я могу получить доступ к этому результату в первом методе? Есть ли способ получить результат от объекта bgWorker?

Я использую его в другом классе, как это (так ExchangeDataAsync должен возвращать мне значение):

string response = Global.ExchangeDataAsync(request); 

UPD.

sharpcloud является правильным. В этом случае функция не является асинхронной. есть ли у вас какие-либо хорошие предложения о том, как вернуть значение другому классу из метода exchangecompleted?

+0

Если вы нацеливаетесь на .Net 4.5, вы можете использовать новую функцию Async/Await feauture (http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx) вместо BackgroundWorker – Mones

+2

. Тогда зачем это асинхронно вообще? Потому что, очевидно, вы хотите заблокировать выполнение, пока не получите ответ. – pyrocumulus

+0

Я использую .Net 4 в своем проекте – Phantom

ответ

1

Вы должны передать e (экземпляр RunWorkerCompletedEventArgs) методу ExchangeCompleted. И используйте свойство Result пройденного e.