光环在那里,
我正在使用VS 2010,我有一个wform客户端应用程序和一个wcf服务。从我的客户端,我将调用 wcf 服务。我实现了回调功能并使用了 netnamedpipe 绑定。我称之为服务方法。此方法内部有一个用户帐户对象列表。此方法将循环访问每个用户帐户对象并调用长时间运行的属性。在每个进程结束时,它将触发事件 [回调] 以通知进程的状态。我计划为用户帐户对象的每个进程使用后台工作线程。但是Rx响应式框架具有更可信的功能,可以满足这一要求。在这种情况下,使用 RX 是否可以并行执行?我只是调用 wcf 服务调用。服务方法正在执行所有这些长时间运行的进程,并将每个进程状态报告回客户端代码[在客户端中实现回调]。
1. Client ---> Wcf ----> wcf.DoLongRunning() --->
2. foreach (UserAccount usr in UserAccountLists) // Is there anyway to avoid looping
{
class A = new class();
call A.Method1(usr) and A.Method2(usr) // call these 2 methods parallel.
// these 2 methods have return values. how to handle that one also in Rx ???
}
这似乎是并行执行中的并行执行。
任何人都可以使用 Rx 或任何线程模型为此功能建议一种好方法。处理每个对象将花费更多时间。有什么方法可以并行执行吗?
你试过用Parallel.Foreach
吗?
Parallel.ForEach<UserAccount>(UserAccountLists, usr =>
{
classA A = new classA();
A.Method1(usr);
A.Method2(usr);
});
使用 Parallel.Foreach
代码将等待所有操作完成,然后再继续。
另一种方法是保持原样,并将方法调用更改为使用 Task
:
Task t1 = new Task(() => A.Method1(usr));
t1.Start();
Task t2 = new Task(() => A.Method2(usr));
t2.Start();
这样,该方法将在所有操作完成之前返回。所以我想这取决于你想要什么。请注意,在Task
示例中,这两个方法将彼此独立运行,我不知道在您的情况下是否可以。
编辑:如果任务具有结果类型,则可以访问该任务的结果。可以通过为 Task 指定一个泛型参数来指定结果类型: Task<string>
将有string
的结果。
至于数千个任务:我认为简单地创建数千个任务对象是不明智的。但是,您可以搜索自定义TaskScheduler
的各种实现。这应该可以让您更好地控制"许多"任务的创建和执行。