我想要实现的是创建一个全局任务,可以在一次运行中执行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;)...)是一个错误或正在发生什么?
答案 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