2014-01-12 6 views
2

В настоящее время я пишу небольшое веб-сервис в C#. Единственное, что я хочу сделать, когда я его начинаю, показывает мне небольшой графический интерфейс и мгновенно открывает ожидающий TcpConnection для входящих запросов, который затем должен регистрироваться в графическом интерфейсе и обрабатываться с ...Application.Run() Форма не отображается

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

как обычно, форма в настоящее время экземпляр по Application.Run(new Form1());

Мой конструктор выглядит так, как я хочу, чтобы приложение для немедленного открытия TcpConnection ...

public Form1() 
    { 
     InitializeComponent(); 
     startTcpConn(); 
    } 

У меня есть ощущение, что ожидания соединения каким-то образом блокирует отображение моей формы :(

Я также попытался начать TcpConn с тайм-аут, который не помогло. Процесс выполняется в фоновом режиме (как вы можете видеть в диспетчере задач, но вы не видите эту форму. Не в режиме отладки или выпуска или даже при запуске без VS ...

+0

Ваше чувство является правильным. Слишком рано открывать соединение. Вам также необходимо использовать какой-то асинхронный шаблон. –

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Показать метод 'startTcpConn();'. Существует несколько вариантов асинхронного выполнения операции соединения. –

ответ

0

Самый простой способ запуска TCP Способ подключения асинхронно, чтобы начать новую задачу. Это позволит запустить новую операцию и немедленно возвращает управление в конструктор, который теперь будет в состоянии завершить.

public Form1() 
{ 
    InitializeComponent(); 
    Task.Run(()=>startTcpConn()); 
} 

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

0

Я не уверен, что startTcpConn, но я думаю, он открывает соединение, и ждет для получения сетевых данных. Это в основном означает, что вы «приостанавливаете» поток пользовательского интерфейса, и вы не позволяете ему обрабатывать пользовательский интерфейс, поэтому он ничего не показывает.

Вы должны изменить свой код, чтобы он делает эту работу в другом потоке, и ждать, чтобы сделать это после загрузки формы:

public Form1() 
{ 
    InitializeComponent(); 
} 

public void Form1_loaded(object sender, EventArgs e) 
{ 
    Task.Run(() => startTcpConn()); 
} 
+0

Благодарим вас за отзыв, это отлично сработало, в сочетании с формальным событием «Показано». Я вижу свой UI :) Но теперь я не могу изменить элементы моей формы из другой задачи, как вы сказали. Будет ли еще способ с событиями или рабочими изменять элементы формы с помощью метода startTcpConn? – Vinzenz

+0

@ user2334932 Вы не можете изменить элементы пользовательского интерфейса из потока ThreaPool. Вы должны использовать Invoke, чтобы поток пользовательского интерфейса внес изменения для вас. Вот ответ, который я только что написал кому-то: http://stackoverflow.com/a/21070045/885318 – i3arnon

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