我有通过委托指针从外部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的委托不匹配。那么我如何将这样的方法放在不同的线程上呢?
答案 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
中传递所需的参数。