如何判断Task.Run是否在一个循环内完成
How to determine whether Task.Run is completed within a loop
这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以在未来可能出现的场景中应用它。
我正在使用 C#。
我正在进行压力测试,所以这不是生产代码。
我通过网络服务将数据上传到我的服务器。
我使用 Run.Task 启动服务。
在允许下一个 Run.Task 开始之前,我检查任务是否完成。
这是在一个循环中完成的。
但是,因为我使用的是模块化声明的任务,结果不会受到影响吗?
我可以声明一个本地 Task.Run 变量,但我想看看这个问题 1st 能走多远。
如果 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
}
);
IMO 你不需要计时器。使用 Task Continuation 您 订阅 到 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."));
输出为:
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.
您可以像这样等待您的任务来等待您的任务完成
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
}
});
}
}
这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以在未来可能出现的场景中应用它。
我正在使用 C#。
我正在进行压力测试,所以这不是生产代码。
我通过网络服务将数据上传到我的服务器。
我使用 Run.Task 启动服务。
在允许下一个 Run.Task 开始之前,我检查任务是否完成。
这是在一个循环中完成的。
但是,因为我使用的是模块化声明的任务,结果不会受到影响吗? 我可以声明一个本地 Task.Run 变量,但我想看看这个问题 1st 能走多远。
如果 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
}
);
IMO 你不需要计时器。使用 Task Continuation 您 订阅 到 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."));
输出为:
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.
您可以像这样等待您的任务来等待您的任务完成
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
}
});
}
}