我想运行一个应该在n毫秒后超时的操作.我已经实现了两种方法,一种是在等待n毫秒后自己取消操作,另一种是在n毫秒后将CancellationToken设置传递到期.
我担心当我的系统负载很重时,canceltoken可能会在操作开始之前到期.看来如果我自己使用Task.Delay()实现超时,那么在我的操作开始之后,Delay()调用才会运行.
我是这样做的:
public static async Task<T> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout)
{
Task completedTask = await Task.WhenAny(task, Task.Delay(timeout));
if (completedTask == task)
{
return await task;
}
throw new TimeoutException();
}
// Use it like this
await SomeOperationAsync().TimeoutAfter(TimeSpan.FromMilliseconds(n));
Run Code Online (Sandbox Code Playgroud)
相比:
CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);
Run Code Online (Sandbox Code Playgroud) 我正在查询表中的实体,更改它们,然后执行替换操作.替换操作失败,因为etag上的etag属性为null.我检查过,当我从CreateQuery()调用中获取实体时etag为null,但是当我执行Retrieve()时填充etag.有没有办法手动获取etag?
IEnumerable<MyEntity> query = from e in serviceContext.CreateQuery<MyEntity>(tableName)
where e.Id == queryId
select e;
MyEntity entity = query.FirstOrDefault();
// Update the MyEntity object
var replaceOperation = TableOperation.Replace(entity);
MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation);
// Exception is thrown here that eTag value is null
Run Code Online (Sandbox Code Playgroud) 我有一个删除资源并创建新资源的脚本.它时不时地超时,我无法弄清楚为什么.这似乎发生在我多次运行脚本时,但我无法得到明确的模式.我发现我的服务器还没有收到消息,因为还没有记录请求.
$old_values = Invoke-RestMethod -Uri $uri -Method Get
foreach($old_value in $old_values.result) {
Invoke-RestMethod -Uri "$uri&key=$old_value.id" -Method Delete
}
$new_value = Invoke-RestMethod -Uri "$uri" -Body "{}" -ContentType application/json -Method Post
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我直接从powershell运行Invoke-RestMethod调用时,偶尔会出现超时.我也和Fiddler一起跑了他们,从来没有超时.
[编辑]我一直在检查与netstat的连接.命令挂起时,它们被列为ESTABLISHED.但我一直看到TIME_WAIT连接列在我的服务器上.我的关系有可能没有关闭吗?
我的视图中有一个隐藏的字段,如下所示:
using (Html.BeginForm("Action", "Schedule"))
{
@Html.Hidden("Id", Model.Schedule.Id)
...
}
Run Code Online (Sandbox Code Playgroud)
以及一个接收如下信息的动作方法:
public ActionResult AddEventToSchedule(Event NewEvent, Guid Id)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
即使Model.Schedule.Id不为空,我仍然会传入一个空的Guid.我检查了html源代码,隐藏字段也是一个空的Guid(使用断点来验证Model.Schedule.Id不为空).
奇怪的是当我尝试通过下面的模型访问Id值时,html隐藏字段使用guid正确填充,但传递给action方法的模型为空.
public ActionResult AddEventToSchedule(Event NewEvent, ScheduleModel model)
{
// model.Schedule is null!
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试发送一个带有HttpRequest这样的JSON对象:
{
"some.setting.withperiods":"myvalue"
}
Run Code Online (Sandbox Code Playgroud)
我一直在为我的其他请求创建匿名对象,但由于名称包含一个点,因此我不能这样做.
我知道我可以创建一个类并指定[DataMember(Name="some.setting.withperiods")]属性,但必须有一个更轻量级的解决方案.