Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.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# .NET核心时间异步方法_C#_Asp.net Core - Fatal编程技术网

C# .NET核心时间异步方法

C# .NET核心时间异步方法,c#,asp.net-core,C#,Asp.net Core,我有几种asynec方法 其中一个触发启动进程的POST方法。然后,我需要每隔10分钟“采样”另一个GET方法的结果,并检查状态是否已从挂起更改为成功 我尝试使用System.Threading.Timer,但运气不好,抱怨我的方法是异步的 错误CS0407“任务活动.repeatobject”具有错误的返回类型活动 这是我的代码: public async Task waitForCampaignLoadAsync(string Uri) { ......

我有几种asynec方法

其中一个触发启动进程的POST方法。然后,我需要每隔10分钟“采样”另一个GET方法的结果,并检查状态是否已从挂起更改为成功

我尝试使用System.Threading.Timer,但运气不好,抱怨我的方法是异步的

错误CS0407“任务活动.repeatobject”具有错误的返回类型活动

这是我的代码:

    public async Task waitForCampaignLoadAsync(string Uri)
    {
           ...........
           var container = JsonConvert.DeserializeObject<CampaignTempleteStatus>(json);
            if(container.status == "pending")
            {
                var autoEvent = new AutoResetEvent(false);

                //The next row triggers the error
                var stateTimer = new Timer(repeat, autoEvent, 1000, (1000 * 60 * 10));
                //How can I keep repeating this, until (bool isFinished = true)??

            }

public async Task repeat(Object stateInfo)
{
    if(...)
      isFinished = true;
}

另一件事是,如何在repeat函数中传递额外的信息?我需要为内部ussage传递Uri输入?

计时器的第一个参数是TimerCallback委托,它应该返回void

var stateTimer = new Timer(Repeat, autoEvent, 1000, (1000 * 60 * 10));

private void Repeat(object state)
{
    ....
}

当一个异步方法开始变得复杂时,肯定是出了问题。大多数情况下,异步代码看起来几乎与同步代码相同,只是添加了wait

简单的轮询循环可以简单到:

public async Task<string> waitForCampaignLoadAsync(string uri)
{
    var client=new HttpClient();
    for(int i=0;i<30;i++)
    {
        token.ThrowIfCancellationRequested();
        var json = await client.GetStringAsync(uri);
        var container = JsonConvert.DeserializeObject<CampaignTempleteStatus>(json);
        if (container.status != "pending")
        {
            return container.status;
        }
        await Task.Delay(10000); 
    }
    return "Timed out!";
}
这段代码可以改进。例如,GetStringAsync不接受取消令牌。不过,该操作可以分为两个步骤,一个是使用取消令牌调用GetAsync,等待服务器发送结果 另一个指向HttpContent.ReadAsStringAsync以读取响应,例如:

var response=await client.GetAsync(uri,token)
response.EnsureSuccessStatusCode();
var json=await response.Content.ReadAsStringAsync();
...

你的代码没有compile@MelGerats关于我所说的,这是有道理的。如果你能提供一个脚本,那就太棒了。@Yossi你不需要自动resetevent和async/await。如果要取消计时器,请使用CancellationToken。@Yossi您想做什么?投票?为什么不在循环中使用Task.Delay,或者使用不需要轮询的API呢?您可以使用TaskCompletionSource将其他异步模式(如回调、事件)转换为任务
 var cts=new CancellationTokenSource(TimeSpan.FromMinutes(5));
 try
 {
     var result=waitForCampaignLoadAsync(uri,cts.Token);
     //Process the result ....
 }
 catch(OperationCancelledExcepction ex)
 {
     //Handle the timeout here
 }
var response=await client.GetAsync(uri,token)
response.EnsureSuccessStatusCode();
var json=await response.Content.ReadAsStringAsync();
...