C # BackgroundWorker блокировка при вызове базы данных в обработчике DoWork - PullRequest
0 голосов
/ 02 июня 2011

Я пытаюсь следовать приведенному здесь примеру 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, и это, кажется, работает нормально.

1 Ответ

0 голосов
/ 02 июня 2011

Этого не должно произойти, если:

Вы ожидаете результата базы данных (или чего-то, что блокирует поток пользовательского интерфейса) в следующих строках после асинхронного вызова DoWork.

Положите1006 * на следующей строке после вызова RunWorkerAsync, и вы должны немедленно получить поток (или добавить этот код к своему вопросу)

...