0

我想要实现的是创建一个全局任务,它可以在一次运行中执行 n 次,但它可以将对象作为参数并具有不同的值,如下所示

我有一个列表,其中包含我的全局任务将要接收的所有对象,

List<string> StringList = new List<string>();
StringList.Add("A");
StringList.Add("C");
StringList.Add("B");
StringList.Add("D");
StringList.Add("E");
StringList.Add("F");

然后我有一个委托函数列表

List<Func<string, string>> TasksList = new List<Func<string, string>>();

StringList.ForEach(c=> {
                TasksList.Add(x => Push(c));
            });

然后我想将此列表中的每个任务称为执行任务,我看到的是我必须设置要调用的参数,在这种情况下,我为所有任务都设置了“A”,但它需要第一次初始化这还不错,因为它是我想要的。

var resultII = TasksList.Select(c => Observable.Start(() => c("A"))).CombineLatest().Finally(() => Console.WriteLine("Done!"));

OUTPUT: 

Executing C on Thread: 4 
Executing A on Thread: 5 
Executing B on Thread: 7 
Executing D on Thread: 7 
Executing E on Thread: 5 
Executing F on Thread: 4

Done! 
5 
4 
7 
7 
5 
4

但我的问题是,还有其他方法可以做到这一点吗?每次我调用 Observable.Start 时,这些任务已经运行了吗?或者当我用 Observable.Start 调用它们时它们才开始?在不考虑首次初始化的情况下传递“A”值 (StringList.Add("A") ,StringList.Add("C")...) 是错误还是发生了什么?

4

1 回答 1

1

你问的有点模糊,但这看起来怎么样?

void Main()
{
    List<string> StringList = new List<string>()
    {
        "A", "B", "C", "D", "E", "F"
    };

    var query =
        StringList
            .ToObservable()
            .SelectMany(c => Observable.FromAsync(() => Push(c)))
            .ToArray();

    var result = query.Wait();

    Console.WriteLine(String.Join(", ", result));
}

public Task<string> Push(string input)
{
    return Task.Factory.StartNew(() =>
    {
        var id = System.Threading.Thread.CurrentThread.ManagedThreadId;
        Console.WriteLine($"Executing {input} on Thread: {id}");
        return input;
    });
}

这给了我:

在线程上执行 A:19
在线程上执行 D:22
在线程上执行 B:18
在线程上执行 F:22
在线程上执行 E:19
在线程上执行 C:16
A、D、B、F、E、C
于 2018-04-18T08:57:56.250 回答