Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将类作为参数发送到线程?_C#_Multithreading_Parameters - Fatal编程技术网

C# 将类作为参数发送到线程?

C# 将类作为参数发送到线程?,c#,multithreading,parameters,C#,Multithreading,Parameters,所以我试图找到一种方法来动态地将一个类类型传递给一个线程,这样它就可以调用发出它的类,从而再次动态地将数据返回给那个类 以下是我正在尝试的,其中ServerClass是此主函数的类: public static void Main() { UDPClass clsUDP = new UDPClass(); Thread clsUDPThread = new Thread(new ThreadStart(delegate() { clsUDP.UDPListen(64000, Se

所以我试图找到一种方法来动态地将一个类类型传递给一个线程,这样它就可以调用发出它的类,从而再次动态地将数据返回给那个类

以下是我正在尝试的,其中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)
{
}

你可以用这样的代码做很多事情

class X : BaseClass
{ 
   ...
}

class Y : X
{ 
    int yField;
}

...

int Main(BaseClass instance)
{ 
    if (instance is Y) (instance as Y).yField = 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();
   }   
}
public void UDPListen(int UDPPort, Action<string> callback)
{
  ...
  callback("bla bla");
  ...
}
如果它是一个简单的单方法回调,那么您也可以使用委托进行此类通知。使用接口,您可以定义多个回调,还可以定义方法/属性,以便在需要时查询侦听器。下面是使用委托的示例代码

在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();
   }   
}
public void UDPListen(int UDPPort, Action<string> callback)
{
  ...
  callback("bla bla");
  ...
}

您可以使用ParameteredThreadStart在新线程中使用参数调用方法

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指出的,您需要传递对服务器类的引用,而不是类型,以便能够使用它的成员