Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定Task.Run是否在循环内完成_C#_Task - Fatal编程技术网

C# 如何确定Task.Run是否在循环内完成

C# 如何确定Task.Run是否在循环内完成,c#,task,C#,Task,这可能是一个奇怪的问题,它确实是为了我的教育目的,所以我可以在未来可能出现的场景中应用它 我用的是C# 我正在进行压力测试,所以这不完全是生产代码 我通过web服务将数据上传到服务器 我使用Run.Task启动服务 我检查任务是否已完成,然后才允许下一次运行。任务开始 这是在一个循环中完成的 但是,因为我使用的是模块化声明的任务,所以结果不会受到影响吗? 我可以声明一个本地Task.Run变量,但我想看看这个问题能解决多少 如果Task.Run可以引发一个事件来表示它已完成,那么这可能不是问题

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

我用的是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
                            }
                        });     
    }
}