Необработанные исключения в BackgroundWorker

Есть два способа сделать это.

Первый в XML-коде. Вам нужно обратить внимание на Gravity Атрибут. Вы также можете найти этот атрибут в графическом редакторе; это может быть проще, чем редактор XML.

<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_vertical|center_horizontal"
    android:text="Your Text"
/>

Для вашего конкретного сценария значения гравитации будут:

center_vertical|center_horizontal

В графическом редакторе вы найдете все возможные значения, даже увидите их результаты.

67
задан Andy 25 June 2009 в 15:04
поделиться

2 ответа

То, что вы описываете, не является определенным поведением BackgroundWorker. Я подозреваю, что вы делаете что-то не так.

Вот небольшой пример, который доказывает, что BackgroundWorker использует исключения в DoWork и делает их доступными вам в RunWorkerCompleted :

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => 
    { 
        throw new InvalidOperationException("oh shiznit!"); 
    };
worker.RunWorkerCompleted += (sender, e) =>
    {
        if(e.Error != null)
        {
            MessageBox.Show("There was an error! " + e.Error.ToString());
        }
    };
worker.RunWorkerAsync();

My Навыки психической отладки раскрывают мне вашу проблему: вы обращаетесь к e.Result в обработчике RunWorkerCompleted - если есть e.Error, вы должны обработать ее, не обращаясь к e.Result. Например, следующий код плохой, плохой, плохой и вызовет исключение во время выполнения:

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => 
    { 
        throw new InvalidOperationException("oh shiznit!"); 
    };
worker.RunWorkerCompleted += (sender, e) =>
    {
        // OH NOOOOOOOES! Runtime exception, you can't access e.Result if there's an
        // error. You can check for errors using e.Error.
        var result = e.Result; 
    };
worker.RunWorkerAsync();

Вот правильная реализация обработчика событий RunWorkerCompleted:

private void RunWorkerCompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error == null)
    {
       DoSomethingWith(e.Result); // Access e.Result only if no error occurred.
    }
}

VOILA, вы не получите исключения времени выполнения.

125
ответ дан 24 November 2019 в 14:30
поделиться

[Править]

Иуда имеет большое значение. В моем примере были указаны особенности обработки ошибки, но мой код фактически вызвал бы другое исключение, если бы исключение никогда не попадало в метод DoWork. Этот пример подходит, потому что мы специально показываем возможности обработки ошибок BackgroundWorker. Однако, если вы не проверяете параметр ошибки на null, это может быть вашей проблемой.

[/ Edit]

Я не вижу таких же результатов. Вы можете разместить небольшой код? Вот мой код.

private void Form1_Load(object sender, EventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.RunWorkerAsync();
}

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Will cause another exception if an exception didn't occur.
    // We should be checking to see if e.Error is not "null".
    textBox1.Text = "Error? " + e.Error;
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        if (i < 5)
        {
            Thread.Sleep(100);
        }
        else
        {
            throw new Exception("BOOM");
        }   
    }
}

Вывод программы:

Ошибка? System.Exception: БУМ в BackgroundException.Form1.worker_DoWork (Объект отправитель, DoWorkEventArgs e) в D: \ Workspaces \ Sandbox \ BackgroundException \ BackgroundException \ Form1.cs: строка 43 в System.ComponentModel.BackgroundWorker.OnDoWork (DoWorkEventArgs есть System.ComponentModel.BackgroundWorker.WorkerThreadStart (Объект аргумент)

Интересная статья, похожая на ваш вопрос. В нем есть раздел по обработке исключений.

http://www.developerdotstar.com/community/node/671

1
ответ дан 24 November 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: