简体   繁体   中英

calling dialog and getting values from it in backgroundworker?

I am working on a WPF project where I have to import data from a lot of single files. The actual importing of those files and the data in them is being done in a backgroundworker doWork method. It works like a charm, does the job and updating a progress bar also works perfectly.

Now though, depending on what I encounter in those files, I occasionally need to get a decision from the User before I can proceed processing the current file.

What is the best way to open a window/dialog, getting the values set in there back into the backgroundworker.doWork method and continue processing?

Is that even possible with a backgroundworker or do I need to keep that processing logic in the main/UI thread and update the progress bar from there somehow?

I hope some of you can give me some hints or point me to other resources since I have not found much useful information for my specific problem.

You can call the ShowDialog of an OpenFileDailog class on a new Thread or BackgroundWorker ( this will also create a new thread)

But when you want to pass or update any property or control that is running on the main thread you will need to use the Disptacher like this

Dispatcher.BeginInvoke(new Action(() => { YourMethodThatUpdatesSomething(); }));

Background worker works in a different thread. You can not invoke UI directly from a background thread. One way of achiving what you are trying to do is by using a flag and Dispatcher to invoke UI for user input

    bool WaitFor_Input = false; //flag to indicate user input status

    private void ThreadRun()
    {
        //THIS IS IN Background worker thread
        //do task
        WaitFor_Input = true;
        //ask for user input
        Dispatcher.BeginInvoke(new Action(Show_Dialogue), null);
        while (WaitFor_Input); //Background worker waits untill user input is complete
        //continue further processing
    }

    private void Show_Dialogue()
    {
        //THIS IS IN UI THREAD
        //show your dialogue box here, update data variables
        //finally set
        WaitFor_Input = false;
    }

Keeping processing logic in a background thread is actually a good idea.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM