启动具有多个参数的任务的标准做法是啥

Posted

技术标签:

【中文标题】启动具有多个参数的任务的标准做法是啥【英文标题】:What is the standard practice for starting a task with multiple parameters启动具有多个参数的任务的标准做法是什么 【发布时间】:2011-07-11 21:46:50 【问题描述】:

我现在有

class MyParamClass

   all the parameters I need to pass to the task


MyParamClass myParamObj = new MyParamClass();
myParamObj.FirstParam = xyz;
myParamObj.SecondParam = abc;
mytask = new Task<bool>(myMethod, myParamObj,_cancelToken);
mytask.Start()

bool myMethod(object passedMyParamObj)

   MyParamClass myParamObj = passedMyParamObj as MyParamClass;
  //phew! finally access to passed parameters

有没有我可以做到这一点而无需创建类 MyParamClass ?如果没有这种杂耍,我如何将多个参数传递给任务?这是标准做法吗?谢谢

【问题讨论】:

pfx 与这个问题有什么关系……只是好奇 单击此链接并搜索 PFX en.wikipedia.org/wiki/Parallel_Extensions 我错过了什么吗?谢谢 不...我没有意识到 PFX 是由 TPL 和 PLinq 组成的。 【参考方案1】:

您可以使用 lambda 或内联委托来执行此操作:

myTask = new Task<bool>(() => MyMethod(xyz, abc), _cancelToken);

【讨论】:

这样干净多了。我想当我有大量参数时,我会选择我所拥有的,对于一个较小的列表,我会使用你的方法来提高可读性。谢谢 如果你发现你有很多参数,我倾向于尝试将任务的所有代码也重构到另一个类中,通过构造函数或属性传递参数,然后使用 DoWhateverAsync()返回任务。并不总是那么容易做到,但通常值得一试。 这种方法易于阅读,而且很方便,因为它本质上是让编译器在幕后为您构建参数类。请注意不要在访问修改后的闭包时遇到麻烦,这是您的原始方法所没有的风险。 谢谢斯科特。 “访问修改后的闭包”是我之前通过 Resharper 看到的东西,但并没有真正理解。我在网上看到很多文章解释了这一点。是时候喝杯咖啡和阅读了。【参考方案2】:

使用包装类来处理是执行此操作的标准方法。你唯一能做的就是使用Tuple 来避免写MyParamClass

mytask = new Task(myMethod, Tuple.Create(xyz, abc), _cancelToken);
mytask.Start();

bool myMethod(object passedTuple)

     var myParamObj = passTuple as Tuple<int, string>;

【讨论】:

很高兴了解元组。只需阅读此内容。赞成。谢谢

以上是关于启动具有多个参数的任务的标准做法是啥的主要内容,如果未能解决你的问题,请参考以下文章

在 Redis 中存储 JWT 令牌的标准做法是啥?

具有多个参数的 JPA 标准 API

在 Linux 上从桌面启动的程序的默认标准输入和标准输出是啥?

具有非实体参数的 JPA 标准构造

C# 中具有表达式主体的私有成员的标准命名约定是啥[关闭]

在 Core Data 中加载具有关系的托管对象时的标准行为是啥?