簡體   English   中英

Backgroundworker和UI交互

[英]Backgroundworker and UI interactivity

我正在使用后台工作者進行耗時的操作(要將一些數據上傳到服務器並從服務器下載一些數據)。 所有服務器通信都是通過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請求並使應用程序UI交互的其他好方法嗎

如注釋中所建議,“ ProgressChanged”中的代碼在UI線程上運行,這導致UI凍結(因為此處理程序中有服務器請求)。

ProgressChanged 

處理程序僅在您進行了一些常規的UI更新(例如已完成的百分比)時才有用(應該使用)。 在您的情況下,請考慮將整個代碼移至新方法(例如GetFromServer(int id) ),然后從DoWork內部對該方法進行調用。 這將導致所有這些I / O工作在后台線程上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM