如何从C#中的另一个线程调用线程?

时间:2017-10-08 02:46:10

标签: c# multithreading sockets graphics

我想知道如何从C#Windows窗体应用程序中的另一个线程调用线程。我正在使用TCP / IP通信开发UI。在我的程序中,我在收到我想在Picture Box上的UI上绘制数据后,将数据从Console应用程序(客户端)发送到Windows Form Application(服务器)。

我在服务器上创建了两个线程,第一个线程是Listener线程(监听客户端套接字),第二个线程是Handler线程(处理从客户端套接字接收的数据)我想创建图形从处理程序线程中绘制线程。

目前,我正在处理程序线程中进行图形绘制,但我想在一个单独的线程中进行。请指导我怎么办?

1 个答案:

答案 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#特有的结构进行一些阅读。一本关于通用同步/线程的优秀计算机科学书籍通常为理解多年来您将遇到的各种平台/语言特定实现提供了重要基础。在紧密循环中测试任何多线程代码是个好主意,特别是如果你无法直接证明同步的正确性。