C# 如何确定Task.Run是否在循环内完成
这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以在未来可能出现的场景中应用它 我用的是C# 我正在进行压力测试,所以这不完全是生产代码 我通过web服务将数据上传到服务器 我使用Run.Task启动服务 我检查任务是否已完成,然后才允许下一次运行。任务开始 这是在一个循环中完成的 但是,因为我使用的是模块化声明的任务,所以结果不会受到影响吗? 我可以声明一个本地Task.Run变量,但我想看看这个问题能解决多少 如果Task.Run可以引发一个事件来表示它已完成,那么这可能不是问题 这是我的代码: //模块声明:C# 如何确定Task.Run是否在循环内完成,c#,task,C#,Task,这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以在未来可能出现的场景中应用它 我用的是C# 我正在进行压力测试,所以这不完全是生产代码 我通过web服务将数据上传到服务器 我使用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
}
);
在我看来,你不需要定时器。使用订阅done事件:
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."));
您的代码可能如下所示:
var webTask = Task.Run(() =>
{
try
{
wcf.UploadMotionDynamicRaw(bytes); //my web service
}
catch (Exception ex)
{
//deal with error
}
}).ContinueWith(t => taskCounter++);
通过任务继续,您甚至可以区分失败和成功的过程结果,如果您只想计算成功的任务-使用。您可以像这样等待任务完成
await webTask;
将异步等待“webTask”完成。您可以使用wait Task.Delay
而不是计时器,它将异步等待延迟过期。我也会考虑让WCF调用异步,这样就不必调用“代码>任务”。运行< /COD>。请参阅以获取一些提示
我将代码重写如下:
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
}
});
}
}
使用。莫迪有不同的观点。其中之一是在任务完成后做一些事情。在我看来,你不需要计时器-将你的代码更改为
webTask。继续…
@pasty嗨,谢谢你的回复。我现在会看一下,然后再报告-谢谢:)@pasty,所以当我将代码修改为:webTask=newtask(wcf.UploadMotionDynamicRaw(bytes));它给了我一个错误“不能从“void”转换为“Action”?嗨,我使用计时器只是为了压力测试,完全同意你的看法。MSDN上的示例与您的不同,我更喜欢您的示例。更清楚。谢谢你好,谢谢你的不同回答。非常感谢。我知道等待,但我想要异步。这样做的原因是为了监视web服务器是否能够跟上我的重复调用。通过监视队列,我可以(希望)检测到这一点。
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
}
});
}
}