glibc обеспечивает след () функция.
http://www.gnu.org/software/libc/manual/html_node/Backtraces.html
Вы можете использовать TcpListener
, который ожидает входящих соединений в другом потоке. Каждый раз, когда вы получаете новое соединение, создавайте новый поток для его обработки. Используйте Control.Invoke
для обновления пользовательского интерфейса из потока без пользовательского интерфейса. Вот краткий пример:
public MainForm()
{
InitializeComponents();
StartListener();
}
private TcpListener _listener;
private Thread _listenerThread;
private void StartListener()
{
_listenerThread = new Thread(RunListener);
_listenerThread.Start();
}
private void RunListener()
{
_listener = new TcpListener(IPAddress.Any, 8080);
_listener.Start();
while(true)
{
TcpClient client = _listener.AcceptTcpClient();
this.Invoke(
new Action(
() =>
{
textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint);
}
));;
ThreadPool.QueueUserWorkItem(ProcessClient, client);
}
}
private void ProcessClient(object state)
{
TcpClient client = state as TcpClient;
// Do something with client
// ...
}
Вы можете использовать класс TcpListener . В документации есть пример.
При запуске вы можете порождать (создавать) новый поток, который в бесконечном цикле прослушивает новые сообщения. После получения сообщения поток может обновить некоторый общий ресурс (установить флаг). Конечно, вы могли бы сделать это более сложным, если бы использовали синхронизированную очередь для передачи сообщений. Или через WCF (хотя это кажется излишним для ваших целей).
Возможно, это не лучший способ сделать это, но он должен работать ...
Вы можете запустить свой код прослушивателя TCP в новом потоке при запуске программы ... Это способ прослушивания TCP-кода, в то время как пользовательский интерфейс отключен от других вещей. Когда что-то происходит в потоке TCP, он должен будет сигнализировать потоку пользовательского интерфейса каким-то событием или очередью событий.
Теперь, что касается обновления объекта WinForms при получении, я считаю, что только поток, создавший элемент управления WinForms, может обновлять элементы управления. Так что вам также придется это учитывать.
Это проблема, с которой я тоже боролся раньше ... В моем текущем проекте я делаю то, что упоминал выше ... однако для его работы требуется довольно много синхронизации потоков.