Здравствуйте, vit_as, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>Есть обертка над командами, вида
А>>А>>public class Command : ICommand
А>>{
А>> public Action execute;
А>> public void Execute()
А>> {
А>> if ( execute != null )
А>> execute();
А>> }
А>>}
А>>
А>>Хотелось бы сделать execute() асинхронным, попробовал сделать так
А>>А>>public void Execute()
А>>{
А>> if ( execute != null )
А>> {
А>> var task = new Task( execute );
А>> task.Start();
А>> }
А>>}
А>>
А>>Но возникла ошибка , в которой сообщается что визуальные контролы должны инициализироваться в STA потоке. Как это можно обойти ? в execute используется обращение к БД, динамическое создание окна.
_>Dispathcer.BeginInvoke
Спасибо, но получилось не совсем то что нужно.
Вот пример
XAML
<StackPanel>
<Button Content="Async Call" Click="ButtonClick" />
<Button Content="Test Click" />
</StackPanel>
public void DoSomeWork()
{
System.Threading.Thread.Sleep( 15000 );
var window = new Window();
System.Threading.Thread.Sleep( 5000 );
window.Show();
}
public void ButtonClick( object sender, EventArgs e )
{
Dispatcher.BeginInvoke( new Action( DoSomeWork ) );
}
Так интерфейс зависает , после нажатия на кнопку 20 секунд ничего нельзя нажать.
Посмотрел в документации пример еще один, сделал как там, но в этом случае кидает исключение что поток не тот.
Если в DoSomeWorkAsync использовать Dispatcher оригинальный то получается тот же зависон на 20 секунд.
public static void DoSomeWork()
{
System.Threading.Thread.Sleep( 15000 );
var window = new Window();
System.Threading.Thread.Sleep( 5000 );
window.Show();
}
public static void DoSomeWorkAsync()
{
Dispatcher.BeginInvoke( new Action( DoSomeWork ) );
}
public void ButtonClick( object sender, EventArgs e )
{
new Action( DoSomeWorkAsync ).BeginInvoke( null, null );
}