【问题标题】:Use the SameTask with task Id使用带有任务 ID 的 SameTask
【发布时间】:2016-08-14 05:06:34
【问题描述】:

我需要为不同的列表参数运行相同的方法。例如 List X , List Y 等,当方法启动时,它永远不会停止,直到用户关闭应用程序,如下所示。我的问题是,在运行时,如果我有列表 X,Foo 方法必须作为不同的任务工作,顺便说一下,新项目可以在运行时添加到列表中,如果新参数添加到列表 X,当方法工作时,我确保 X 的新项目进入相同的方法任务。如何使用 task.CurrentId 处理这个问题?是否可以获取任务 currentId 并将参数发送到该特定任务?

public void Foo(string name)
{
    while(true)
    {
        //some process
    }
}

GetNewParameter(String sample)
{
    if(someCase)
    {
        //if there is a foo method runing on X list on a different Task, I must add
        //and make sure to be new parameter is sent to Foo method working on already X 
        //List.
        X.Add(sample);
        //Task.Factory.StartNew(() => foo(sample));
        //Send to already running task
    }
    if(someCase)
    {
        //If there is no task working on Y list I need to create a new task to run Foo
        //method on it.
        Y.Add(sample);
        Task.Factory.StartNew(() => foo(sample));
    }
}

【问题讨论】:

  • 使用一些你将要填充的集合,“任务”将被消耗。生产者-消费者模式。为什么使用相同的任务对您来说如此重要?以及你想如何实际使用它?
  • Lists 有不同类型的字符串,并且每个列表的项目相互关联,所以如果有一个方法在 X 列表上工作,新项目将添加到 X 列表中,我无法创建新任务,它必须在已经在 X 列表项上工作的相同任务中进行评估。
  • 好的,但是想象一下你有你想要的任务......你想如何使用它......一旦你创建了它,你就无法访问它正在运行的动作......跨度>
  • 嗯。我明白了,我明白了,你的意思是我不能向 runnnig 方法发送任何参数,但是是否可以在方法中保留一个列表,例如 Foo 中的列表 X,我尝试将新项目添加到列表中以进行评估?但当然同样的事情发生在这里,我确保在 runnung x list 上工作方法
  • 请务必正确锁定资源... System.Collections.Concurrent 命名空间有一些非常有用的集合。

标签: c# asynchronous task-parallel-library task


【解决方案1】:

与其尝试搜索任务然后对其进行操作(可怕而且几乎不可能),不如使用生产者-消费者模式。 https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

简而言之 - 在两个单独的线程中,您将为处理生成输入,而在另一个线程中,您将处理它们。用于处理的输入将保存在线程安全集合中(对它们的访问必须处于锁定状态)。

处理线程应该循环。它会查看是否有任何输入要处理,如果是,它将处理它并查看它是否同时没有被取消。如果没有要处理的东西并且没有被取消,它会进入休眠状态,然后它会再次检查。

“是否有可能获取一个任务 currentId 并将参数发送给该特定任务?” 对于任何函数调用,在调用它之后都无法更改发送给它的参数。您可以更改参数引用的值(将新项目添加到列表或更改类的属性),但无法更改值类型的参数。这些被复制,您无法从调用者那里进一步访问它们。

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多