Управляйте функцией в новом потоке c# приложение Windows

Я работаю над применением, которое вызывает функцию, населяют() на window_load

Это выполнение функции занимает приблизительно 1 минуту, чтобы закончить. Я хочу сделать эту функцию, которую назовут в отдельной нити.

Я использую следующий код

Thread thread = new Thread(PopulateAndDrawGraph);
        thread.Start();

в этой функции наконец линия

nodeXlControl1. (Верный) DrawGraph;

Здесь исключение происходит

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

что неправильно, на самом деле происходит

2
приблизительно вы разделяете трассировку стека того исключения?
добавлено автор Arshad, источник

7 ответы

Вам только разрешают получить доступ к средствам управления UI из той же самой нити, которая создала контроль, который является usally самой нитью UI.

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

Вот фантастическая статья, которая была опубликована в журнале MSDN: Дайте вашему основанному на.NET заявлению быстрый и отзывчивый UI с многократными нитями, который объяснит в мельчайших подробностях, как можно сделать то, что вы хотите сделать.

Статья немного стара, но те же самые принципы все еще применяются.

Я предполагаю, что более новый язык C# показывает - как новое async / ждут , ключевые слова - должны сделать вашу задачу немного легче.

Но имейте в виду, что те же самые старые ограничения для доступа к средствам управления UI все еще существуют. Нет никакого пути вокруг, чтобы понять основы как descripbed в статье.

2
добавлено

Есть 2 способа обращаться с этим, правильным путем и иначе:

1: Если вы хотите хорошее рабочее решение тогда, это должно добиться цели..

    private void SetText(string text)
    {
       //InvokeRequired required compares the thread ID of the 
       //calling thread to the thread ID of the creating thread. 
       //If these threads are different, it returns true. 
        if (this.textBox1.InvokeRequired)
        {   
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }

msdn.microsoft.com/en-us/library/ms171728.aspx

2: but if you want a quick solution without guarantee that it will work properly, just set this variable: Control.CheckForIllegalCrossThreadCalls = False

1
добавлено

проверить эта статья (Как к: Сделайте Ориентированные на многопотоковое исполнение Звонки), здесь. Это объясняет все связанные пункты относительно взаимных требований нити. Я также рекомендую, чтобы вы изучили понятие "Задачи" в c#. Есть очень хорошо написанный lib, который помогает вам обращаться с параллелизмом и подобными понятиями!

0
добавлено
@ChrisF +1... отмечен и отредактирован!
добавлено автор Leonardo, источник
Свяжитесь только ответы - not' t хорошие ответы. Я знаю you' происходят ve, связанные с MSDN, но изменениями и если связь разложится, то этот ответ станет бесполезным.
добавлено автор ChrisF, источник

Я использовал класс BackgroundWorker в c#.

0
добавлено

Так как вы пытаетесь получить доступ к элементу UI от нити, которую необходимо назвать , Призывают . Таким образом в PopulateAndDrawGraph вы должны иметь:

Invoke((Action)(() =>
{
    nodeXlControl1.DrawGraph(true);
}));
0
добавлено

You can't access the UI controls from any other thread except the thread which has created this control(you can access/change the UI control properties from the main UI thread only). Go through this link, i hope this makes you clear Cross-thread operation not valid

0
добавлено

Проблема, что любое взаимодействие UI должно произойти в главной нити применения. Мой совет состоит в том, что вы тянете, делают вычисление в отдельной нити, но собирают ваши результаты в объекте. После того, как нить закончена, можно извлечь результат того объекта и поместить ее nodeXlControl1.

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

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot