我想知道如何从C#Windows窗体应用程序中的另一个线程调用线程。我正在使用TCP / IP通信开发UI。在我的程序中,我在收到我想在Picture Box上的UI上绘制数据后,将数据从Console应用程序(客户端)发送到Windows Form Application(服务器)。
我在服务器上创建了两个线程,第一个线程是Listener线程(监听客户端套接字),第二个线程是Handler线程(处理从客户端套接字接收的数据)我想创建图形从处理程序线程中绘制线程。
目前,我正在处理程序线程中进行图形绘制,但我想在一个单独的线程中进行。请指导我怎么办?
答案 0 :(得分:0)
有一百万种皮肤养猫的方法,但这是我对最简单方法的建议。我假设您知道如何创建线程等。
using System;
using System.Collections.Generic;
using System.Threading;
namespace foo
{
class Packet
{
public double x;
public double y;
public double z;
}
public class Class1
{
Queue<Packet> qp;
public Class1()
{
qp = new Queue<Packet>();
}
public void SendData(Packet p)
{
// prevent reader from accessing while we insert
lock (qp)
{
qp.Enqueue(p);
}
}
public void ProcessIncomingPackets()
{
Packet p;
// or until we decide to stop
while (true)
{
p = null;
// prevent the writer from adding while we're reading and maybe removing an item
lock (qp)
{
if (0 < qp.Count)
{
p = qp.Dequeue();
}
}
// with lock released, do something if we have a packet
if (null != p)
{
// graph, etc.
}
// spin faster for better responsiveness and more wasted CPU
Thread.Sleep(100); // milliseconds
}
}
} // Class 1
} // namespace
还有一百万种方法可以优化这一点,但也会产生非常糟糕的错误。 因此,我建议您对同步,线程,消息传递的数据结构以及C#特有的结构进行一些阅读。一本关于通用同步/线程的优秀计算机科学书籍通常为理解多年来您将遇到的各种平台/语言特定实现提供了重要基础。在紧密循环中测试任何多线程代码是个好主意,特别是如果你无法直接证明同步的正确性。