使用具有任务Id的SameTask

本文关键字:Id SameTask 任务 | 更新日期: 2024-10-24 08:57:28

我需要为不同的列表参数运行相同的方法。例如ListX、ListY等。当方法启动时,它永远不会停止,直到用户关闭应用程序,如下所示。我的问题是,在运行时,如果我有列表X,Foo方法必须作为一个不同的任务工作,顺便说一句,可以在运行时将新项添加到列表中,当方法工作时,如果将新参数添加到列表X,我会确保X的新项转到同一方法任务。如何使用任务处理此问题。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));
    }
}

使用具有任务Id的SameTask

与其尝试搜索Task然后对其进行操作(可怕且不可能),不如使用Producer-Consumer模式。https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

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

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

"是否可以获取任务currentId并向该特定任务发送参数?"对于任何函数调用,都无法更改在调用后发送给它的参数。您可以更改参数引用的值(向列表中添加新项或更改类的属性),但无法更改值类型的参数。这些都是复制的,您无法从调用方进一步访问它们。