Я пытаюсь следовать приведенному здесь примеру BackgroundWorker http://msdn.microsoft.com/en-us/library/wkays279.aspx под заголовком «Возвращение значений из многопоточных процедур»
Я поместил трудоемкий вызов в базу данных в обработчике событий DoWork.BackgroundWorker.Я ожидаю, что, как только я вызову BackgroundWorkerAsync (объект), этот вызов будет происходить в фоновом режиме, а не блокировать выполнение остальной части приложения.Проблема в том, что этого не происходит.Все приложение блокируется и ожидает возврата из базы данных.Как только он возвращается, приложение снова реагирует.
Вот мой код
//initialization in a method.
Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
Retriever temp = (Retriever)e.Argument;
e.Result = temp.RetrieveLongDBCallThatReturnsADataSet() //App blocks until done.
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
System.Data.DataSet result = (System.Data.DataSet)e.Result;
//Do stuff with the DataSet.
}
public void Retrieve(object arg1, object arg2, object arg3)
{
Retriever temp = new Retriever();
InitializeBackgroundWorker(); //wire up events
temp.Prop1 = arg1;
temp.Prop2 = arg2;
temp.Prop3 = arg3;
Worker.RunWorkerAsync(temp);
//Code that is expected to start executing, but instead blocks until temp.RetrieveLongDBCallThatReturnsADataSet() finishes.
}
Кто-нибудь может увидеть, что мне здесь не хватает?Я сделал то же самое с вызовом WebService, и это, кажется, работает нормально.