2012-05-06 19 views
1

在我们的应用程序中,我们使用TPL创建任务,只要我们想要进行服务调用即可。我们有一个忙指示符,当任务启动时设置为true并在任务完成或发生故障时清除。有没有办法以通用方式完成此任务,而不是为每个创建的任务执行此操作?集中处理TPL创建的新任务前后的操作

一审:

 ComponentViewModel.Instance.IsApplicationBusy = true; 
     ComponentViewModel.Instance.BusyMessage = "Loading..."; 

     var task1 = Task.Factory.StartNew(() => DoTask1()); 
     task1.ContinueWith(antecdent => 
     { 
      ComponentViewModel.Instance.IsApplicationBusy = false; 
      CustomAction1(); 
     } 

二审:

 ComponentViewModel.Instance.IsApplicationBusy = true; 
     ComponentViewModel.Instance.BusyMessage = "Loading..."; 

     var task2 = Task.Factory.StartNew(() => DoTask2()); 
     task2.ContinueWith(antecdent => 
     { 
      ComponentViewModel.Instance.IsApplicationBusy = false; 
      CustomAction2(); 
     } 

相同的逻辑,重复全部通过应用程序只要服务调用时,有没有办法避免这种重复?

例如,有一个dragstarted和dragcompleted事件会被所有拖动操作触发,所以可能通过扩展任务工厂或其他方式来完成taskstarted和taskcompleted事件?

编辑:做出改变,这样的问题更加clear.You现在可以观察到,开始和结束任务之前的步骤是一样的,但不同的功能需要当它运行到完成

回答

0

编辑要为每个任务执行:看来我误解了这个问题。创建这个“开始,等待,继续”作为一个集中的功能是一个很好的举措,并能像这样被创建:

public void DoIt(Action ThingToDo) { 
    ComponentViewModel.Instance.IsApplicationBusy = true; 
    ComponentViewModel.Instance.BusyMessage = "Loading..."; 

    var loadProviderTask = Task.Factory.StartNew(ThingToDo); 
    loadProviderTask.ContinueWith(antecdent => 
    { 
     ComponentViewModel.Instance.IsApplicationBusy = false; 
    } 
} 
+0

嗨,对不起我的问题没有得到clear.I已编辑question.I想不同任务完成后要执行的函数 –

+0

@VasudevanKannan,然后将其作为另一个委托参数传递给函数,并在继续中调用它。 – svick

+0

@robrich,你的意思是'Task.Factory.StartNew(ThingToDo)'?另外,.Net中通常的命名约定是以小写字母开始参数。 – svick