2014-02-08 2 views
-1

У меня есть ошибка при открытии окна и закрытии другого.C# WPF InvalidOperationException был необработанным

The calling thread must be STA, because many UI components require this. 

Я использую RedCorona Sockets ... http://www.redcorona.com/Sockets.cs Вот код ...

public partial class MainWindowThingy : Window 
{ 
    public ClientInfo client; 
    public MainWindowThingy() //The Error appears here 
    { 
     InitializeComponent(); 
     StartTCP(); 
    } 
    public void StartTCP() 
    { 
     Socket sock = Sockets.CreateTCPSocket("localhost", 2345); 
     client = new ClientInfo(sock, false); // Don't start receiving yet 
     client.OnReadBytes += new ConnectionReadBytes(ReadData); 
     client.BeginReceive(); 
    } 
    void ReadData(ClientInfo ci, byte[] data, int len) 
    { 
     string msg = (System.Text.Encoding.UTF8.GetString(data, 0, len)); 
     string[] amsg = msg.Split(' '); 
     switch (amsg[0]) 
     { 
      case "login": 
       if (bool.Parse(amsg[1]) == true) 
       { 
        MainWindowThingy SecondWindow = new MainWindowThingy(); 
        Login FirstWindow = new Login(); 
        SecondWindow.Show(); 
        FirstWindow.Close(); //It starts here, the error... 
       } 
       else 
       { 
       } 
       break; 
     } 
    } 
} 
} 

Основном, он дает мне ошибку в "общественном контроле()" При закрытии Первая форма ...

Ммм ... Я хочу, чтобы открыть другую форму и закрыть другой ... поясню

Edit: Изменено Название класса ...

+0

Вы называете это фоновой нитью? –

+0

Не называйте свое окно «Управление». Это уже класс в .NET Framework и будет только создавать проблемы дальше по дороге. – nvoigt

+0

Я так думаю ... Но я не знаю, как использовать рассеиватель на этом ... Можете ли вы привести мне пример? – user2993512

ответ

2

Обратный вызов ReadData, вероятно, вызывается в фоновом потоке, который не имеет доступа к потоку пользовательского интерфейса. Вам нужно будет использовать Dispatcher.BeginInvoke (пояснил here).

+0

Можете ли вы привести мне пример? – user2993512

+0

Вы прочитали ссылку, которую я предоставил? Сначала получите ссылку на FirstWindow.Dispatcher перед вызовом StartTCP() ;. После этого вызова Dispatcher.BeginInvoke (System.Windows.Threading.DispatcherPriority.SystemIdle,() => FirstWindow.Close()); –

Смежные вопросы