开发者

Gui freeezing when using threading

I am stuck and was hoping someone could help me.

I have made a class/gui with a loading bar set to marquee so that when a task is being carried out i could display it to the user.

In one of my gui classes, in the constructor on the first line i am making a new instance of this class and then doing

    LoadingBar bar = new LoadingBar();
    Thread thread = new Thread(bar.Show);
    thread.Start();

However, even tho the main programme thread is going off doi开发者_StackOverflow中文版ng some more intensive stuff, this gui still seems to freeze, even if i use backround worker.

Is there anything wrong with the approach i have mentioned and if so what do i need to change?

Thanks


You need to reverse your method. The GUI needs to stay in the main thread while the work is done in a "worker thread" (typically a BackGroundWorker). Then the worker reports back to the GUI which then updates.


You'd better do the opposite. Make your intensive work in the thread (or a background worker), and show the wait screen in the main application thread.


You need to use a BackgroundWorker. Drag one onto your form, click backgroundWorker1 and set the WorkerReportsProgress property to True

Then goto the events (via the properties window) and attach handlers for

  • DoWork, this is where all the work that is represented by the progress bar. You will "report progress" via this and the background worker will make sure ProgressChanged is called on the UI thread.
  • ProgressChanged, this is where you update the UI based on progress and state data reported to the method

DoWork event looks something like this

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var userState = new StateClass();

    while (working)
    {
        // TODO: do work here

        // update the state surrounding this task via userState
        userState.property = "some status";

        // report the progress so that backgroundWorker1_ProgressChanged gets called 
        this.backgroundWorker1.ReportProgress(percentComplete, userState);
    }

}

ProgressChanged event looks like this

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // e.UserState contains the state data you passed to ReportProgress, 
    //   you have to cast it to the right type though, since its of type object
    var userState = (StateClass)e.UserState;
    int progress = e.ProgressPercentage;

    // TODO: report progress to the UI with the above variables
}

Now all you have to do is tell the background worker to do work by calling this.backgroundWorker1.RunWorkerAsync()


I don't think you're doing all your work within the background worker or the GUI wouldn't be freezing. We'll need to see more of your code or you'll need to have another look at background worker examples to see what could be wrong.

EDIT

Add a call to System.Threading.Thread.Sleep(1); after your report progress call

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜