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