Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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中的参数启动新线程#_C#_Multithreading - Fatal编程技术网

C# 使用c中的参数启动新线程#

C# 使用c中的参数启动新线程#,c#,multithreading,C#,Multithreading,我想使用c#中的参数化线程创建一个新线程 rulehandler是类的对象 Thread applyPolicyThread = new Thread( new ParameterizedThreadStart(rulehandler.ApplyPolicy)); applyPolicyThread.start(false); 应用策略的重载方法与委托system.threading.start不匹配,这是一个错误。为什么不使用TPL: Task.Factory.StartNew

我想使用c#中的参数化线程创建一个新线程

rulehandler
是类的对象

Thread applyPolicyThread = new Thread(
       new ParameterizedThreadStart(rulehandler.ApplyPolicy));
applyPolicyThread.start(false);
应用策略的重载方法与委托system.threading.start不匹配,这是一个错误。为什么不使用TPL:

Task.Factory.StartNew(() 
   => 
   {
      //This is executed in a separate thread
      ruleHandler.ApplyPolicy(false))
   });
这将在系统方便时启动一个新线程(不是立即启动,而是很快启动)。
它允许您传递强类型参数

为什么不使用第三方物流:

Task.Factory.StartNew(() 
   => 
   {
      //This is executed in a separate thread
      ruleHandler.ApplyPolicy(false))
   });
这将在系统方便时启动一个新线程(不是立即启动,而是很快启动)。

它允许您传递强类型参数

参数化线程的参数类型必须始终为
object
(请参阅):


参数化线程的参数类型必须始终为
object
(请参阅):


这不是使用ParameterizedThreadStart的方式。 您需要将方法作为参数传递,如下所示:

Thread applyPolicyThread = new Thread(
       new ParameterizedThreadStart(Start));
applyPolicyThread.start(false);
其中Start是这样一种方法

   static void Start(object info)
    {
    // This receives the value passed into the Thread.Start method.
    }

这不是使用ParameterizedThreadStart的方式。 您需要将方法作为参数传递,如下所示:

Thread applyPolicyThread = new Thread(
       new ParameterizedThreadStart(Start));
applyPolicyThread.start(false);
其中Start是这样一种方法

   static void Start(object info)
    {
    // This receives the value passed into the Thread.Start method.
    }

不确定
rulehandler.ApplyPolicy
是什么,但您应该传递一个以
object
作为单个参数的方法(您可以将其强制转换为内部参数):


不确定
rulehandler.ApplyPolicy
是什么,但您应该传递一个以
object
作为单个参数的方法(您可以将其强制转换为内部参数):


您可以通过创建一个无参数方法作为threadstart()的目标来执行此操作,并且可以从该无参数方法调用带有参数的实际方法。

您可以通过创建一个无参数方法作为threadstart()的目标来执行此操作通过这个无参数方法,您可以使用参数调用实际方法。

您可以显示
rulehandler.ApplyPolicy
的签名吗?根据我能从发布的代码中推断出的一点,它应该看起来像
void ApplyPolicy(object p)
。public void ApplyPolicy(bool isNewPolicy)您能显示
rulehandler.ApplyPolicy的签名吗?根据我能从发布的代码中推断出的一点,它应该是
void ApplyPolicy(object p)
。public void ApplyPolicy(bool isNewPolicy)是的,它是。我会详细说明的。请稍微定义一下Task.Factory.StartNew()是的,是的。我会详细说明的。请定义一下Task.Factory.StartNew()对不起,我不明白你说的是ApplyPolicy本身。你说得对,所以+1;)如果可以的话,现在有点“老派”。除非你需要线程同步启动(当然是异步执行)。@Baboon:是的,我同意大多数情况,但这是问题的答案,为什么会有异常。IMO线程应该用于在后台“始终”运行的任务(如服务器的TcpListner),而
任务
应该用于“简短”的后台任务(我认为在本例中是这样的)…事实上,它确实回答了他的问题;)但是,任务可以用于长时间运行的异步操作,然后应指定
TaskCreationOptions.longlunning
。对于短期操作,不建议使用
BackgroundWorker
吗?对不起,我不明白您所说的是ApplyPolicy本身。你说得对,所以+1;)如果可以的话,现在有点“老派”。除非你需要线程同步启动(当然是异步执行)。@Baboon:是的,我同意大多数情况,但这是问题的答案,为什么会有异常。IMO线程应该用于在后台“始终”运行的任务(如服务器的TcpListner),而
任务
应该用于“简短”的后台任务(我认为在本例中是这样的)…事实上,它确实回答了他的问题;)但是,任务可以用于长时间运行的异步操作,然后应指定
TaskCreationOptions.longlunning
。对于短期操作,不建议使用
BackgroundWorker