1

晕在那里,

我正在使用 VS 2010,并且我有一个 winform 客户端应用程序和一个 wcf 服务。从我的客户那里,我将调用 wcf 服务。我实现了回调功能并使用 netnamedpipe 绑定。我调用了一个服务方法。这个方法里面有一个 UserAccount 对象的列表。此方法将遍历每个 UserAccount 对象并调用一个长时间运行的进程。在每个进程结束时,它会触发事件[callback]来通知进程的状态。我打算为 UserAccount 对象的每个进程使用后台工作人员。但是 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 或任何线程模型为这个功能提出一个好的方法。处理每个对象将花费更多时间。有什么方法可以并行执行??

4

1 回答 1

1

你试过使用Parallel.Foreach吗?

Parallel.ForEach<UserAccount>(UserAccountLists, usr =>
{
    classA A = new classA(); 
    A.Method1(usr);
    A.Method2(usr);
});

代码将Parallel.Foreach等待所有操作完成后再继续。

另一种方法是让 foreach 保持原样,并将方法调用更改为 use Task

Task t1 = new Task(() => A.Method1(usr));
t1.Start();

Task t2 = new Task(() => A.Method2(usr));
t2.Start();

这样,该方法将在所有操作完成之前返回。所以我想这取决于你想要什么。请注意,在Task示例中,这两种方法将彼此独立运行,我不知道在您的情况下是否可以。

编辑:如果任务具有结果类型,则可以访问任务的结果。可以通过给 Task 一个通用参数来指定结果类型: Task<string>将具有string.

至于数千个任务:我认为简单地创建数千个任务对象是不明智的。但是,您可以搜索 customTaskScheduler的各种实现。这应该使您可以更好地控制“许多”任务的创建和执行。

于 2013-01-30T14:16:53.803 回答