Dean Kuga
Dean Kuga

Reputation: 12119

Task.Factory.StartNew and Application.Current.Dispatcher.Invoke

Given this code:

Task.Factory.StartNew(() =>
{
    Application.Current.Dispatcher.Invoke(() =>
    {
        //Code to run on UI thread
    });
    //Code to run on a background thread                             
}).

Is it safe to assume that "Code to run on a background thread" will not be reached under any circumstances until "Code to run on UI thread" is finished executing?

Upvotes: 2

Views: 1452

Answers (2)

rdyhalt
rdyhalt

Reputation: 96

When you start the Task, it will run as an worker thread and it will block until Invoke(...) is over. When Invoke(..) is done it will continue on the worker thread.

"Code to run on UI thread" will run first, next will be "Code to run on a background thread".

You then have the possibility to do some work in a worker thread like read files, write files, query on database with out blocking the main thread, and when needed you can update UI elements with data via Invoke(...)

But take a look at Async/Await, it can make async operation and updating UI element easier to understand.

Upvotes: 1

Jakotheshadows
Jakotheshadows

Reputation: 1515

Dispatcher.Invoke Method (Delegate, Object[])

Executes the specified delegate with the specified arguments synchronously on the thread the Dispatcher is associated with.

https://msdn.microsoft.com/en-us/library/cc647509(v=vs.110).aspx

also see this:

Asynchronous vs synchronous execution, what does it really mean?

Because Dispatcher.Invoke is executed synchronously, and how synchronous execution is defined, your assumption is safe.

Upvotes: 0

Related Questions