如何确定 Task.Run 是否在循环中完成

本文关键字:循环 是否 何确定 Task Run | 更新日期: 2023-09-27 18:36:19

这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以在将来可能出现的场景中应用它。

我正在使用 C#。

我正在压力测试,所以这不是完全的生产代码。

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

我使用Task.Run启动服务。

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

这是在循环中完成的。

但是,因为我使用的是模块化声明Task结果不会受到影响吗?我可以声明一个局部Task.Run变量,但我想看看这个问题能走多远。

如果Task.Run可以提出一个事件说它已经完成,那么这可能不是问题吗?

这是我的代码:

模块声明:

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

在通过计时器调用的函数中

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

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

如何确定 Task.Run 是否在循环中完成

IMO 你不需要计时器。使用任务继续,您可以订阅完成事件:

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++);

通过任务延续,您甚至可以区分失败和成功过程结果,如果您只想计算成功任务 - 使用任务延续优化。

您可以通过像这样等待任务来等待任务完成

await webTask;

这将异步等待"网络任务"完成。您可以使用异步等待延迟过期的await Task.Delay而不是计时器。我还会考虑使 wcf 调用异步,这样您就不必在 Task.Run 内部调用。有关一些提示,请参阅此问题。

我会按如下方式重写代码:

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
                            }
                        });     
    }
}