Подтвердить что ты не робот

Регистрация DragDrop не удалась

System.InvalidOperationException: регистрация DragDrop не добиться успеха. --- > System.Threading.ThreadStateException:

Что означает это исключение? Я получаю это в этой строке, пытаясь добавить панель к панели во время выполнения...

splitReport.Panel1.Controls.Add(ChartPanel);

Работа в VS2008 С#

4b9b3361

Ответ 1

Это исключение означает, что поток, который владеет Panel (добавляемая панель), был инициализирован с использованием модели потоков MTA. Система перетаскивания требует, чтобы вызывающий поток использовал модель потока STA (в частности, это требует, чтобы COM был инициализирован через OleInitialize). Модели Threading являются неудачным остатком COM, предшественником платформы .NET.

Если у вас есть атрибут [STAThread] в главной функции, тогда основной поток программы должен быть STA. Вероятнее всего, это объяснение состоит в том, что это исключение происходит в другом потоке. Посмотрите на окно Threads в Visual Studio (Debug | Windows | Threads), когда возникает исключение, и посмотрите, находитесь ли вы в потоке, отличном от основного потока. Если это так, решение, вероятно, так же просто, как установка модели потока для этого нового потока, которую вы можете сделать следующим образом (добавьте этот код в поток, где создается элемент управления):

Thread.CurrentThread.SetApartmentState( ApartmentState.STA )

(Thread и ApartmentState являются членами System.Threading)

Этот код должен произойти до того, как вы начнете новый поток. Как отмечено @Tomer, вы также можете указать это декларативно, используя атрибут [STAThread].

Если вы обнаружите, что исключение происходит в основном потоке, отправьте ответ и сообщите нам, и, возможно, мы сможем помочь больше. Трассировка стека во время исключения может помочь выявить проблему.

Ответ 2

function abc
{
            Thread t = new Thread(new ThreadStart(xyz));
            t.SetApartmentState(ApartmentState.STA);
            t.Start( );    
}
function xyz
{
 the code of Windows form..or whatever which is causing the error
}

Ответ 3

Я не уверен, решила ли вы эту проблему или нет. Я просто столкнулся с этой проблемой, и я исправил ее удаление моего каталога bin.

Ответ 4

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

Одна из возможностей для этого события с [STAThread], отмеченная на Main(), заключается в том, что вы запускаете это в потоке, отличном от того, с которого вы начали.

Я просто столкнулся с этим исключением при попытке создать и показать новую форму в методе BackgroundWorker.DoWork. Чтобы исправить это, я завернул создание и показ своей новой формы в методе, а затем вызвал Invoke на этом методе, чтобы он запускал поток пользовательского интерфейса. Это работало, потому что поток пользовательского интерфейса начинался с метода Main() с [STAThread], отмеченным, как объяснялись здесь другие ответы.

Ответ 5

Добавьте атрибут STAThreadAttribute в метод Main. Этот атрибут требуется, если ваша программа имеет доступ к связанным с OLE функциям, например к классу Clipboard.

[STAThread]

static void Main (строка [] args)

{

}

Ответ 6

Самым простым способом является:

private void DoSomethingOnGui()
{
    if (this.InvokeRequired)
    {
        this.Invoke((MethodInvoker)delegate
        {
            Safe_DoSomethingOnGui();
        });
    }
    else
    {
        Safe_DoSomethingOnGui();
    }
}
private void Safe_DoSomethingOnGui()
{
    // Do whatever you want with the GUI
}

Вы даже можете передавать вещи без проблем:

private void DoSomethingOnGui(object o)
{
    if (this.InvokeRequired)
    {
        this.Invoke((MethodInvoker)delegate
        {
            Safe_DoSomethingOnGui(o);
        });
    }
    else
    {
        Safe_DoSomethingOnGui(o);
    }
}
private void Safe_DoSomethingOnGui(object o)
{
    // Do whatever you want with the GUI and o
}

Ответ 7

Недавно я столкнулся с этой ситуацией, [STAThreadAttribute] в моем случае, и я решил эту проблему с помощью метода Invoke, это может быть полезно для вас, ребята, поэтому я поделился небольшим кодом фрагмент кода:

this.Invoke(new InvokeHandler(delegate() 
{
//Your method here!
}));

И InvokeHandler является делегатом следующим образом:

private delegate void InvokeHandler();

Ответ 8

Я нашел эту ошибку, и я вижу, что тот, который ее показывает, используется при использовании другого потока, вызывающего MessageBox.Show(this, ...), где это не выполняется инициализировано.

Нам нужно удалить владельца окна сообщения, чтобы удалить ошибку.

Ответ 9

Я решил эту ошибку, используя нижеприведенный код... Я использовал фоновый рабочий стол и пытался получить доступ к пользовательскому интерфейсу в фоновом режиме. Именно поэтому получение ошибки - регистрация DragDrop не удалась. Мы не можем получить доступ к пользовательскому интерфейсу из кода, работающего в фоновом рабочем документе или в потоке.

BeginInvoke((MethodInvoker)delegate
{
//write your code here...

});

Спасибо Happy Coding...: