из второго потока.

я есть основной поток пользовательского интерфейса, который запускает приложение и создает форму главного окна (давайте назовем егоW). У меня также есть дополнительный поток, который я раскручиваю и который создает диалоговое окно (давайте назовем егоB).

Я хочу установить владельца диалогаB быть главным окномW, НастройкаBвладелец происходит в потоке, который создалB, В основном:

b.Owner = w;

но это вызывает перекрестное исключение, говорящее мне, что я пытаюсь получить доступ кW объект из неправильного потока.

Поэтому я попытался выполнить код в основном потоке пользовательского интерфейса, используяControl.Invoke наW, Но тогда я получаю ту же ошибку, сообщая мне, что я пытаюсь получить доступB из неверной ветки:

System.InvalidOperationException was unhandled by user code
  Message=Cross-thread operation not valid: Control 'B' accessed from a
  thread other than the thread it was created on.
  Source=System.Windows.Forms

Как я должен сделать это правильно?

 Damien_The_Unbeliever11 мар. 2011 г., 15:05
Возможно, вы можете сказать нам, какой функцией (ями) владения вы хотели бы воспользоваться (надеюсь, не всеми), и мы могли бы предложить способы достижения подобных эффектов?
 Doc Brown11 мар. 2011 г., 14:51
Вы читали этот пост так:stackoverflow.com/questions/3046245/... ? Если это не поможет вам, вы должны опубликовать код, который дает вам ошибку.
 SLaks11 мар. 2011 г., 14:51
Не используйте формы в нескольких потоках. Это доставит вам больше хлопот, чем стоит.
 Pierre Arnaud12 мар. 2011 г., 22:42
Спасибо всем, кто написал; Я знаю, что прошу неприятностей. Мне нужно запустить какой-то устаревший код в основном потоке пользовательского интерфейса, и я хочу, чтобы во время этого процесса отображался диалог прогресса; и я не могу позволить главному потоку пользовательского интерфейса обрабатывать диалог прогресса. Поэтому я пошел на диалог прогресса, управляемый на 100% другим потоком.

Ответы на вопрос(3)

Решение Вопроса

Windows фактически поддерживает создание владельцем окна, созданного в другом потоке. Есть способ отключить эту проверку, что-то, что вы должныникогда делать. За исключением случаев, когда вы должны, я полагаю:

    private void button1_Click(object sender, EventArgs e) {
        var t = new Thread(() => {
            Control.CheckForIllegalCrossThreadCalls = false;
            var frm = new Form2();
            frm.Show(this);
            Control.CheckForIllegalCrossThreadCalls = true;
            Application.Run(frm);
        });
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

я делаюне Знайте, если это на 100% безопасно, может быть взаимодействие Winforms, которое испортит вещи. Вы находитесь в непроверенных водах, кишащих пронзительными акулами.

 Pierre Arnaud12 мар. 2011 г., 22:45
Ваше предложение интересно. В моем случае я могу убедиться, что код, отображающий диалоговое окно, не будет мешать основному потоку пользовательского интерфейса. Я попробую.
 supercat19 июн. 2013 г., 20:25
Вы узнали что-нибудь дополнительно о безопасности вышеупомянутого подхода? Я хотел бы сделать это (иметь одну форму, владеющую формой, которая связана с другим потоком), но вижу две проблемы: (1) Отображение формы, которая принадлежит другой, вызоветOwner.AddOwnedForm который, вероятно, не является потокобезопасным; лучше сделать действие на ветке формы владельца; (2) Если две формы, привязанные к разным потокам, пытаются показать себя одновременно, можно установитьCheckForIllegalCrossThreadCalls=true между временем, когда другой устанавливает его в ложь, и временем, когда он выполняет операцию, которая требует, чтобы он был ложным.

то нет способа сделать то, что вам нужно. Если ты хочешьW владетьB, вам придется создатьB в основной теме иInvoke все ваше взаимодействие сB из второго потока.

B должен быть создан в потоке пользовательского интерфейса.

Вы все еще можете взаимодействовать сB из вторичного потока с помощьюControl.Invoke.

 Pierre Arnaud12 мар. 2011 г., 22:43
В моем случае это не сработает для того, что я намерен сделать: мойB окно не будет обновляться, если основной поток пользовательского интерфейса заблокирован, выполняя свою работу.

Ваш ответ на вопрос