Отправка класса в качестве параметра в поток? - PullRequest
3 голосов
/ 11 мая 2011

Итак, я пытаюсь найти способ динамической передачи типа класса в поток, чтобы он мог вызвать класс, которым он был создан, и, таким образом, динамически вернуть данные этому классу снова.

Здесьэто то, что я пытаюсь, где 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 голос
/ 11 мая 2011

Вам необходимо изменить строку следующим образом:

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();
   }   
}

Вы также можете использовать делегата для таких уведомлений, если это простой обратный вызов метода.С помощью интерфейса вы можете определить несколько обратных вызовов, а также методы / свойства для запроса слушателя, если это необходимо.Вот пример кода с использованием делегата

В классе 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();
1 голос
/ 11 мая 2011

Вы можете многое сделать с таким кодом.

class X : BaseClass
{ 
   ...
}

class Y : X
{ 
    int yField;
}

...

int Main(BaseClass instance)
{ 
    if (instance is Y) (instance as Y).yField = 1;
}
0 голосов
/ 11 мая 2011

Вы можете использовать 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, вам нужно будет передать ссылку на класс сервера вместо того, чтобы тип былвозможность использовать его членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...