如何将一个带有aguments的方法放在不同的线程上?

时间:2015-09-12 18:06:17

标签: c# multithreading

我有通过委托指针从外部dll获取参数的方法:

public delegate void NotificationsCallbackDelegate(CinectorNotification message);

NotificationsCallbackDelegate notificationsCallbackDeleg;
IntPtr notificationsCallbackPointer;


notificationsCallbackDeleg = NotificationsCallback;
notificationsCallbackPointer = Marshal.GetFunctionPointerForDelegate(notificationsCallbackDeleg);
instance.SetNotificationsCallback(notificationsCallbackPointer);

 private void NotificationsCallback(CinectorNotification notif)
 {
   Log.AppendText("[" + notif.timestamp + "] " + notif.type + ": " + notif.message + Environment.NewLine);
 }

因此,只要外部引擎生成一些日志,输入参数'message'就可以在应用程序流期间随时由dll传递。这就像一场活动。

我使用以下代码将方法放在新线程上:

private void startNotifications()
{
   Thread NotificationsThread = new Thread(new ThreadStart(NotificationsCallback));
   NotificationsThread.IsBackground = true;
   NotificationsThread.Start();
}

但是,方法NotificationsCallback(CinectorNotification notif)接受一个参数,因此与ThreadStart的委托不匹配。那么我如何将这样的方法放在不同的线程上呢?

3 个答案:

答案 0 :(得分:2)

您可以使用Task.Run并为其提供一个lambda,您可以使用您需要的任何参数调用NotificationsCallback例如:

private void startNotifications()
{
   Task.Run(() => NotificationsCallback(arg1, arg2) );
}

这将导致在ThreadPool线程上运行NotificationsCallback。

有关Task.Run的详细信息,请参阅:https://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx

答案 1 :(得分:1)

如果参数中传递的方法是无参数的,则代码可以正常工作。

如果你想要一个参数化线程,你应该使用Thread构造函数的另一个重载,它将占用ParameterizedThreadStart

然后使用参数调用线程上的

Start方法,该参数传递给线程方法,如下所示:

Thread thread = new Thread(WorkerMethod);
thread.Start(35); //for example 35

void WorkerMethod(object parameter)
{
    int? intParameter = parameter as int?; //for example
    if (intParameter.HasValue)
    {
        //do stuff
    }
}

您还可以使用Task,这是一种更现代的多线程方法。

Task.Factory.StartNew(() => WorkerMethod(35)); //for example 35

在.NET 4.5及更高版本中使用Task.Run。在任务1中,可以传递尽可能多的参数(不为它们创建容器),并且参数可以强类型...不仅仅是object

答案 2 :(得分:0)

您可以使用ThreadStart而不是使用ParameterizedThreadStart,并在Thread.Start中传递所需的参数。