Проблема с Task.Factory.StartNew и открытой формой из внешней сборки

У меня есть основной проект приложения Windows и другое приложение библиотеки классов. В приложении библиотеки классов у меня есть форма (созданная программно), которая отображается в проекте приложения основных окон после длительной работы.

Я хочу показать эту форму (в библиотеке классов) асинхронно.

Я написал этот код для основного проекта приложения:

Task t = Task.Factory.StartNew(delegate
            {

                if (this.InvokeRequired)
                {
                    this.Invoke((Action)(() => textBox1.Text += "Enter Task"));
                    this.Invoke((Action)(() =>
                        {
                            ExternalAssembly.OpenForm of = new ExternalAssembly.OpenForm();
                            of.ShowWindow();
                        })); 
                }

                this.Invoke((Action)(() => textBox1.Text = textBox1.Text + Environment.NewLine + "Exit Task"));
            }, CancellationToken.None, TaskCreationOptions.None); 

и в библиотеке классов:

public class OpenForm
    {
        public void ShowWindow()
        {
            Thread.Sleep(10000);
            Form1 frm = new Form1();
            frm.ShowDialog();
        }
    }

Но когда отображается форма в библиотеке классов, моя основная форма зависает. Как я могу изменить код, чтобы отображение формы в другой сборке было асинхронным?

Большое спасибо.


person Arian    schedule 24.12.2010    source источник
comment
возможный дубликат проблемы с Task.Factory.StartNew и обновлением пользовательского интерфейса   -  person Hans Passant    schedule 25.12.2010
comment
Нет, это не дубликат этого поста. Этот пост указывает на внешнюю сборку. Спасибо.   -  person Arian    schedule 25.12.2010


Ответы (2)


Вы запустили фоновую задачу с помощью Task.Factory.StartNew. Затем в этой фоновой задаче вы использовали Invoke. Это запускает действие в потоке переднего плана, блокируя фоновый поток до его завершения.

Поскольку код, который вы вызываете (ShowWindow), занимает много времени, вы успешно заблокировали как активные, так и фоновые потоки.

person Roger Lipscombe    schedule 30.12.2010

Вы можете попробовать что-то вроде этого

this.textBox1.Text += "Enter Task";
Task t = Task.Factory.StartNew(
            () =>
                {
                    var of = new ExternalAssembly.OpenForm();
                    of.ShowWindow();
                }).ContinueWith(o => Invoke(new Action(() => this.textBox1.Text += Environment.NewLine + "Exit Task"))
            );
person Eivind T    schedule 30.12.2010