BackgroundWorker在Silverlight中遇到麻烦

时间:2010-07-08 08:42:44

标签: c# silverlight backgroundworker

我提前为这个问题的漫无边际道歉,但我不知道从哪里开始。

我有一个问题,我试图在Silverlight中打开一个excel文件,并对该excel文件进​​行一些处理......但是我在主线程上执行此操作有两个主要问题。

  1. 打开excel文件时,用户界面冻结
  2. 有几个异步调用我发现asynccompleted回调只发生在UI线程结束时(在我打开消息框的情况下)
  3. 所以我正在尝试编写一个后台工作者来完成我的处理任务,但我找不到任何体面的例子(它们都非常简单)。背景工作者模式是否有任何资源?

    当我尝试写一个时,我提出了以下问题

    1. 我无法在类级别访问变量(如果我只想要我的backgroundworker的变量,我是否应该有一个单独的backgroundworker类?)

    2. 显示消息框,暂停中间后台线程过于复杂(这是否意味着我应该有很多小背景工作者?)

    3. 与2如何显示错误消息有关。

1 个答案:

答案 0 :(得分:2)

关于#3,您无法直接从BackgroundWorker线程执行UI。您需要做的是使用事件参数中的所有必要信息触发事件,并在UI线程上处理该事件。

因此,对于您的消息框,您将使用事件参数

中的消息触发事件
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);
        }
    }