0

私が達成したいのは、1回の実行で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 で呼び出したときに開始するだけですか? 最初の初期化 (StringList.Add("A") ,StringList.Add("C")...) を考慮せずに "A" 値を渡すのはバグですか、それとも何が起こっていますか?

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 に答える