Backgroundworker和UI互动

时间:2014-02-14 08:39:25

标签: c# c#-4.0 backgroundworker

我正在使用后台工作程序进行耗时的操作(将一些数据上传到服务器并从服务器下载一些数据)。所有服务器通信都是通过http请求(GET,POST,PUT,Delete),我使用的代码是

private void btnSync_Click(object sender, RoutedEventArgs e)
    {
        btnSync.IsEnabled = false;
        BackgroundWorker syncWorker = new BackgroundWorker();
        syncWorker.WorkerReportsProgress = true;
        syncWorker.WorkerSupportsCancellation = true;
        syncWorker.DoWork+=new DoWorkEventHandler(syncWorker_DoWork);
        syncWorker.ProgressChanged+=new ProgressChangedEventHandler(syncWorker_ProgressChanged);
        syncWorker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(syncWorker_RunWorkerCompleted);
        syncWorker.RunWorkerAsync();
    }
    private void syncWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker target = (BackgroundWorker)sender;
        foreach (...........) // a loop to do some set of actions  on some objects
        {
            target.ReportProgress(1, obj);
            target.ReportProgress(2, obj);
            target.ReportProgress(3, obj);
        }
        target.ReportProgress(4);
    }
    private void syncWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        if (e.ProgressPercentage == 1)
        {  
            string id= e.UserState.ToString(); 
            mySyncHelper.DOGETFROMServer(id); //Issue a GET request and read and process resposne (deserialize json data and insert to local DB)
        }
        if (e.ProgressPercentage == 2)
        {
            string id= e.UserState.ToString(); 
            mySyncHelper.DOGETFROMServer(id);//Issue a GET request and read and process resposne(deserialize json data and insert to local DB)
        }
        if (e.ProgressPercentage == 3)
        {
           string id= e.UserState.ToString(); 
           mySyncHelper.DOGETFROMServer(id);//Issue a GET request and read and process resposne (deserialize json data and insert/Update response data to local DB)
        }
        if (e.ProgressPercentage ==4)
        {
            mySyncHelper.DOPOSTToServer();//Issue a POST request and read and process resposne (deserialize json data and insert/Update response data to local DB)
            mySyncHelper.DOPUTToServer();
            mySyncHelper.DODELETEToServer();
        }
    }
    private void syncWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            txtSyncStatus.Visibility = Visibility.Visible;
            txtSyncStatus.Text = string.Concat(DbookLanguage.message_error, Environment.NewLine , e.Error.Message.ToString());
        }
        else
        {
            btnSync.IsEnabled = true;
            txtSyncStatus.Text = "";
        }
    }

我面临的问题是@某些阶段,应用程序正在等待一段时间来获取http请求的响应,并且在此状态期间整个应用程序进入冻结状态。我用来从服务器获取响应的代码是   var httpResponse =(HttpWebResponse)httpWebRequest.GetResponse(); 在此状态下,应用程序没有响应。

我该如何防止这种情况?是否有任何其他好的方法来制作一系列Http请求并使app UI交互式

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,“ProgressChanged”中的代码在UI线程上运行,导致UI冻结(因为您在此处理程序中有服务器请求)。

ProgressChanged 
只有当您有一些常规UI更新(如完成百分比)时,

处理程序才有用(并且应该使用)。在您的情况下,请考虑将整个代码移动到新方法(例如GetFromServer(int id))并从DoWork内部调用此方法。这将导致所有这些I / O工作在后台线程上运行。

相关问题