Проблемы с BackgroundWorker в Siverlight - PullRequest
0 голосов
/ 08 июля 2010

Я заранее прошу прощения за бессвязный характер этого вопроса, но я не знаю, с чего начать.

У меня есть проблема, когда я пытаюсь открыть файл Excel в Silverlight и выполняю некоторую обработкув этом файле Excel ... но у меня есть две основные проблемы с этим в главном потоке.

  1. при открытии файла Excel пользовательский интерфейс зависает
  2. с несколькими асинхронными вызовами, которые у меня естьобнаружил, что асинхронный обратный вызов происходит только тогда, когда поток пользовательского интерфейса заканчивается (в моем случае, когда открывается окно сообщения)

Итак, я пытаюсь написать фонового работника для выполнения моих задач обработки, но я могуНе найти достойных примеров (все они очень упрощенные).Есть ли какие-то ресурсы для шаблонов фонового рабочего?

Когда я пытался написать один, я столкнулся со следующими проблемами

  1. Я не мог получить доступ к переменным на уровне класса (если я хочу, чтобы переменная только для моего фонового работника должна былаУ меня есть отдельный класс фонового работника?)

  2. Отображение ящиков сообщений и приостановка промежуточного фонового потока слишком сложны (значит ли это, что у меня должно быть много маленьких фоновых работников?)

  3. Относится к 2 способам отображения сообщений об ошибках.

1 Ответ

2 голосов
/ 08 июля 2010

Что касается # 3, вы не можете сделать пользовательский интерфейс напрямую из потока BackgroundWorker.Что вам нужно сделать, это запустить событие со всей необходимой информацией в аргументах события и обработать это событие в потоке пользовательского интерфейса.

Таким образом, что касается ваших окон сообщений, вы будете запускать и событие с сообщением варгументы события

public class MessageBoxEventArgs : EventArgs
{
    public MessageBoxEventArgs(string message)
    {
        this.Message = message;
    }

    public string Message
    {
        get; private set;
    }
}

Запустить событие:

public event EventHandler<MessageBoxEventArgs> Message_Event;

...


        if (this.Message_Event!= null)
        {
            this.Message_Event(this, new MessageBoxEventArgs(message));
        }

Затем обработать его:

    private void MessageEventHandler(object sender, MessageBoxEventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.Invoke((MethodInvoker)delegate { MessageBox.Show(e.Message); });
        }
        else
        {
            MessageBox.Show(e.Message);
        }
    }
...