将类作为参数传递给线程?

3

我正在尝试找到一种动态传递类类型到线程的方法,以便它可以调用发出它的类,并动态地将数据再次返回给该类。

这是我的尝试,其中ServerClass是此主函数的类:

public static void Main()
{
    UDPClass clsUDP = new UDPClass();
    Thread clsUDPThread = new Thread(new ThreadStart(delegate() { clsUDP.UDPListen(64000, ServerClass); }));
    clsUDPThread.Start();
}

这是接收端,在UDPClass中:

public void UDPListen(int UDPPort, Type OldClass)
{
}
3个回答

1

您可以使用此类代码做很多事情。

class X : BaseClass
{ 
   ...
}

class Y : X
{ 
    int yField;
}

...

int Main(BaseClass instance)
{ 
    if (instance is Y) (instance as Y).yField = 1;
}

1
您需要将该行更改为以下内容:
Thread clsUDPThread = new Thread(new ThreadStart(delegate() { clsUDP.UDPListen(64000, typeof(ServerClass)); }));

虽然仅接受类型并不能解决您的问题 - 您需要实际接受该类型的实例(对象)(假设您想调用实例方法/属性)。更好的方法是接受一个您的目标类型必须实现的接口。

编辑:

好的 - 这里是如何使用接口。

public interface IUDPListener
{
   void Notify(string status);
}

在UDP类中,
public void UDPListen(int UDPPort, IUDPListener listner)
{
  ...
  listener.Notify("bla bla");
  ...
}

public class ServerClass : IUDPListener
{
   ...

   public void Notify(string status)
   {
     // Callback from thread
     ...
   }

   // Method that starts thread
   public void StartThread() 
   {
     UDPClass clsUDP = new UDPClass();
     Thread clsUDPThread = new Thread(new ThreadStart(delegate() { clsUDP.UDPListen(64000, this); }));
     clsUDPThread.Start();
   }   
}

如果只是一个简单的回调方法,您也可以使用委托来进行此类通知。使用接口,您可以定义多个回调以及查询侦听器(listener)所需的方法/属性。以下是使用委托的示例代码:

在UDP类中,

public void UDPListen(int UDPPort, Action<string> callback)
{
  ...
  callback("bla bla");
  ...
}

在服务器类中。
public class ServerClass
{
   ...
    private void UdpCallback(string message)
    {
       ...
    }

    // code to start thread
    UDPClass clsUDP = new UDPClass();
    var clsUDPThread = new Thread(new ThreadStart(delegate() {clsUDP.UDPListen(64000, UdpCallback); }));
    clsUDPThread.Start();

0
你可以使用ParameterizedThreadStart在新线程中调用带参数的方法。
public static void Main()
{
    UDPClass.UDPListenParameters threadParameters = new UDPClass.UDPListenParameters();
    threadParameters.UDPPort = 64000;
    threadParameters.OldClass = this.GetType();

    UDPClass clsUDP = new UDPClass();
    Thread clsUDPThread = new Thread(new ParameterizedThreadStart(clsUDP.UDPListen));

    clsUDPThread.Start(threadParameters);
}

public class UDPClass
{
    public void UDPListen(object parameter)
    {
        UDPListenParameters parameters = (UDPListenParameters)parameter;
        // parameters.UDPPort
        // parameters.OldClass
    }

    public class UDPListenParameters
    {
        public int UDPPort;
        public Type OldClass;
    }
}

但正如VinayC所指出的那样,您需要传递服务器类的引用而不是类型才能使用它的成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接