2015-01-04 70 views
4

这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以将它应用于未来可能出现的场景中。如何确定Task.Run是否在一个循环内完成

我正在使用C#。

我是压力测试,所以这不是生产代码。

我通过Web服务将数据上传到我的服务器。

我使用Run.Task启动服务。

我在允许下一个Run.Task开始之前检查是否已完成任务。

这是在一个循环内完成的。

但是,因为我正在使用模块化的声明任务会不会影响结果? 我可以声明一个本地的Task.Run变量,但我想看看我能在第一个问题中得到多少。

如果Task.Run可以引发事件说它已完成,那么这可能不是问题?

这是我的代码:

//模块声明:

private static Task webTask = Task.Run(() => { System.Windows.Forms.Application.DoEvents(); }); 

//在通过定时器

if (webTask.IsCompleted) 
{ 
    //keep count of competed tasks 
} 


webTask = Task.Run(() => 
{ 
    try 
    { 
     wcf.UploadMotionDynamicRaw(bytes); //my web service 
    } 
    catch (Exception ex) 
    { 
     //deal with error 
    } 
); 
+1

使用[任务继续](http://msdn.microsoft.com/en-us/library/ee372288%28v=vs.110%29的.aspx)。有不同的修改。其中之一是*在任务完成后做些事*。国际海事组织你不需要计时器 - 改变你的代码到'webTask.ContinueWith ...'。 – pasty 2015-01-04 10:20:56

+0

@pasty嗨,谢谢你的反应。我会看看这个,现在并报告 - 谢谢:) – 2015-01-04 10:23:24

+0

@pasty所以,当我修改我的代码如下: – 2015-01-04 10:26:10

回答

6

调用的函数IMO你不需要计时器。使用Task Continuation订阅事件:

System.Threading.Tasks.Task 
.Run(() => 
{ 
    // simulate processing 
    for (var i = 0; i < 10; i++) 
    { 
     Console.WriteLine("do something {0}", i + 1); 
    } 
}) 
.ContinueWith(t => Console.WriteLine("done.")); 

输出是:

do something 1 
do something 2 
. 
. 
do something 9 
do something 10 
done 

您的代码看起来是这样的:

var webTask = Task.Run(() => 
{ 
    try 
    { 
     wcf.UploadMotionDynamicRaw(bytes); //my web service 
    } 
    catch (Exception ex) 
    { 
     //deal with error 
    } 
}).ContinueWith(t => taskCounter++); 

随着任务延续你可以失败成功处理结果,如果您只想计算成功任务 - 使用TaskContinuationOptrions

+1

嗨,我只是使用计时器进行压力测试,并完全同意你的看法。 MSDN上的例子与你的不同,我更喜欢你的。更清楚。谢谢 – 2015-01-04 10:31:20

+0

请问downvoter请注意解释一下? – pasty 2015-01-04 13:22:35

2

可以等待你的任务由等待你的任务是这样

await webTask; 

将异步等待“webTask”完成完成。您可以使用await Task.Delay而不是定时器,它将异步等待延迟到期。我也会考虑让wcf调用异步,所以你不必在Task.Run内部调用。有关提示,请参阅this question

我已经重写了代码如下:

public async Task UploadAsync() 
{ 
    while(true) 
    { 
     await Task.Delay(1000); // this is essentially your timer 

     // wait for the webTask to complete asynchrnously 
     await webTask; 

     //keep count of competed tasks 

     webTask = Task.Run(() => 
         { 
          try 
          { 
           // consider generating an asynchronous method for this if possible. 
           wcf.UploadMotionDynamicRaw(bytes); //my web service 
          } 
          catch (Exception ex) 
          { 
           //deal with error 
          } 
         });  
    } 
} 
+0

嗨,谢谢你的不同答案。非常感激。我意识到等待,但我想有异步。所有这些的原因是监视Web服务器是否跟上我的重复呼叫。通过监视队列,我可以(希望)检测到这一点。 – 2015-01-04 11:06:03

相关问题