简体   繁体   中英

Cannot convert lambda expression to type 'System.Delegate'

Neither of these work:

_uiDispatcher.Invoke(() => { });
_uiDispatcher.Invoke(delegate() { });

All I want to do is Invoke an inline method on my main UI thread. So I called this on the main thread:

_uiDispatcher = Dispatcher.CurrentDispatcher;

And now I want to execute some code on that thread from another thread. How do I do it? Am I using the wrong syntax?

Note that this is not a WPF application; I've referenced WindowsBase so I could get access to the Dispatcher class.

The problem is that you aren't providing the exact type of delegate you want to invoke. Dispatcher.Invoke just takes a Delegate . Is it an Action<T> ? If so, what is T ? Is it a MethodInvoker ? Action ? What?

If your delegate takes no arguments and returns nothing, you can use Action or MethodInvoker . Try this:

_uiDispatcher.Invoke(new Action(() => { }));
 this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; }));

Expanding on other answers a little.

Action with no parameters:

_uiDispatcher.Invoke(new Action(() =>
{
    // Do stuff
    textBox1.Text = "Test 123";
}));

Action with 1 parameter:

_uiDispatcher.Invoke(new Action<bool>((flag) =>
{
    if (flag)
    {
        // Do stuff
        textBox1.Text = "Test 123";
    }

}));

Action with 2 parameters:

_uiDispatcher.Invoke(new Action<int, string>((id, value) =>
{
    // Do stuff
    textBox1.Text = $"{value} {id}";
}));

And so on...

Unless I've missed something, all you've told us is this is not a WPF application . I don't think the Dispatcher is the correct class to use.

If this is a WinForm app, your UI thread can be accessed via the WindowsFormsSynchronizationContext

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