如何在后台线程上执行操作

时间:2014-07-21 06:15:53

标签: c# mvvm silverlight-5.0

我正在开发基于MVVM架构的Silverlight项目。 点击一个按钮,执行一个c#linq查询,这需要一些时间来执行(大约一分半钟),因为我的UI会挂起这么长时间,直到收到响应。

我有一个自定义进度条,需要在两者之间显示。 我试图在后台线程上执行这个linq语句,但没有成功。

当前代码:

private void _selectRecords()
{
    //linq-query
}

我尝试了以下步骤,

private void _selectRecords()
{
    System.Threading.Thread worker = new System.Threading.Thread(GetData);
            worker.Start();
}

private void GetData()
{
    //linq-query
}

编辑: 在执行异常Invalid cross-thread access.

的情况下执行上述情况

private void _selectRecords()
{
    System.Threading.Thread worker = new System.Threading.Thread(GetData);
            worker.Start();
}

private void GetData()
{
   ApplicationConstants.AppConstants.WaitCursor = true; //MY PROGRESS BAR
    Deployment.current.Dispatcher.BeginInvoke(()=>{
                //linq-query        
        });

}

如何在后台线程上运行此linq语句?

1 个答案:

答案 0 :(得分:0)

如何使用BackgroundWorker

在视图类

中声明这样的backgroundworker变量
BackgroundWorker _worker;

在视图的构造函数中启动Backgroundworker 像这样

    _worker = new BackgroundWorker();
    _worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
    _worker.ProgressChanged += new ProgressChangedEventHandler(_worker_ProgressChanged);

void _worker_DoWork(object sender, DoWorkEventArgs e)
{
   //call your getdata() method here
    GetData();

}

在按钮单击中,您可以像这样启动此背景工作

m_oWorker.RunWorkerAsync();

使用Progress Changed事件处理程序,您可以向用户显示进度

_worker_ProgressChanged

我只是尝试将您的代码合并到this

之类的内容中