Re[2]: [WPF] Асинхронное выполнение команды
От: Аноним  
Дата: 29.03.11 19:08
Оценка:
Здравствуйте, 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 );

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.