c# - How to handle UI freeze while working with BackgroundWorker -


i'm creating application(logviewer) display logs xml files. note: each xml file can have 1 or more records.my application has show each record 1 row in datagridview control.

basically perform following tasks:

1.from do_work => parse each xml file , add records list.
2.if list size reaches 100 call progresschanged event update ui (datagridview) 100 records.
3.repeat process untill records xml files appended ui (datagridview)

requirements: if user trying read thousands of files, ui should not freeze.

i have implemented above scenario waiting 100 milliseconds in dowork event before calling progresschanged following reason:

1.background thread waits (thread.sleep(100))for 100 milliseconds ui thread can updated meanwhile , visible user(records appending).

do need have thread.sleep() make ui thread render records. there best approach through can update ui without freezing?

because if test application 4 thousand records,then 100 milliseconds waiting time not working , mean application freezes if operations on form.

but if increase waiting time 500 ms works takes more time display records.

so please suggest me better approach in updating ui while working backgroundworker component.

here code:

note: sample code

    private void bworkerreadxmllogs_dowork(object sender, doworkeventargs e)     {         try         {                                            //declare xmllogrecords list hold list of log records displayed on ui             list<xmllogrecord> lstxmllogrecords = new list<xmllogrecord>();              //loop through records sent getlogdetails() function , add list             foreach (xmllogrecord record in getlogdetails(path))             {                 //cancel background thread if cancel requested user.                 if (bworkerreadxmllogs.cancellationpending)                 {                     e.cancel = true;                     return;                 }                 //add log record list                 lstxmllogrecords.add(record);                  /*if list contains 100 items invoke progresschanged event                  appends 100 items logviewer ui (datagridview)*/                 if (lstxmllogrecords.count % 100 == 0)                 {                     //block/wait on background thread processor allocates cycles work on ui/main thread update records on datagridview                     thread.sleep(100); //if wait more time 500 ms ui not freeze takes more time                      bworkerreadxmllogs.reportprogress(0, new list<xmllogrecord>(lstxmllogrecords));                      //clear list start/add items beginning.                     lstxmllogrecords.clear();                 }             }              //invoke progresschanged event updating datagridview if list contains less 100 items greater 0 items             if (lstxmllogrecords.count > 0)             {                                 //invoke progresschanged event update records on datagridview                 bworkerreadxmllogs.reportprogress(0, lstxmllogrecords);             }         }         catch (exception ex)         {             write_trace(ex.message);         }     }      private void bworkerreadxmllogs_progresschanged(object sender, progresschangedeventargs e)     {                        try             {                 var rowindex = 0;                 if (e.userstate list<xmllogrecord>)                 {                     //cast userstate object list<xmllogrecord>                     var records = e.userstate list<xmllogrecord>;                      //iterate on records sent dowork event , append each record logviewer control datagridview ui                     foreach (var record in records)                     {                         //get next row index new row has placed.                         rowindex = dgvlogviewer.rows.count;                          //add emtpy row add empty cells                         dgvlogviewer.rows.add();                          //set logviewer properties if not set                         if (!islogviewerpropertiesset)                         {                             setlogviewerproperties();                         }                          //disable column selection image columns                         disableimagecolumnsselection(rowindex);                          //add data normal or text cells logviewer control (datagridview)                         addlogviewertextcells(rowindex, record);                          //add icons in image columns logviewer control (datagridview)                          addlogviewerimagecells(rowindex, record);                     }                      //sort logviewer control (datagridview) datetime column(index = 2) in descending order.                     dgvlogviewer.sort(dgvlogviewer.columns[mkeys.dttime], listsortdirection.descending);                     dgvlogviewer.columns[mkeys.dttime].headercell.sortglyphdirection = sortorder.descending;                     if (!islogviewersortingdone)                     {                         //call selectedindex changed event of selected record in datagridview                         dgvlogviewer_selectionchanged(null, null);                         islogviewersortingdone = true;                     }                 }             }             catch (exception ex)             {                                    write_trace(ex.message);             }         }     } 

you dont need thread sleep. if fire progresschanged can load 100 records gridview datasource. use update-methods gridview.

  1. add new 100 records datasource bound gridview.

then:

//maybe set datasource again here

gridview.refresh(); 

if doesnt work great take @ begininvoke() , endinvoke() methods well.


Comments

Popular posts from this blog

java - Plugin org.apache.maven.plugins:maven-install-plugin:2.4 or one of its dependencies could not be resolved -

Round ImageView Android -

How can I utilize Yahoo Weather API in android -