使用不同的参数值 - RX.net运行任务N时间

时间:2018-04-17 14:14:58

标签: c# multithreading delegates system.reactive rx.net

我想要实现的是创建一个全局任务,可以在一次运行中执行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));
            });

然后我想把这个列表中的每个任务都称为执行,我看到的是我必须设置要调用的参数,在这种情况下我把&#34; A&#34;对于所有这些,但它需要第一次初始化,这是不错的,因为它是我想要的。

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打电话给他们?通过&#34; A&#34;没有考虑第一次初始化的值(StringList.Add(&#34; A&#34;),StringList.Add(&#34; C&#34;)...)是一个错误或正在发生什么?

1 个答案:

答案 0 :(得分: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;
    });
}

这让我:

Executing A on Thread: 19
Executing D on Thread: 22
Executing B on Thread: 18
Executing F on Thread: 22
Executing E on Thread: 19
Executing C on Thread: 16
A, D, B, F, E, C