给出以下代码:
var cts = new CancellationTokenSource();
try
{
// get a "hot" task
var task = new HttpClient().GetAsync("http://www.google.com", cts.Token);
// request cancellation
cts.Cancel();
await task;
// pass:
Assert.Fail("expected TaskCanceledException to be thrown");
}
catch (TaskCanceledException ex)
{
// pass:
Assert.IsTrue(cts.Token.IsCancellationRequested,
"expected cancellation requested on original token");
// fail:
Assert.IsTrue(ex.CancellationToken.IsCancellationRequested,
"expected cancellation requested on token attached to exception");
}
Run Code Online (Sandbox Code Playgroud)
我希望ex.CancellationToken.IsCancellationRequested
是true
在catch块内,但事实并非如此.我误会了什么吗?
.net c# async-await cancellationtokensource dotnet-httpclient
我有一些(可能)长时间运行的ajax调用,如果用户导航到另一个页面,我想中止.以下jQuery代码在导航离开页面时调用所有挂起的XMLHttpRequest对象的中止:
$.ajaxSetup({
beforeSend: function(xhr) {
$(window).bind('beforeunload', function() {
xhr.abort();
});
}
});
Run Code Online (Sandbox Code Playgroud)
在测试用例中,我强制在被调用的服务器端操作上等待10秒.使用Firebug,我确认上面的代码确实导致所有挂起的ajax调用在我单击页面上的任何链接时立即停止.但是,浏览器仍然等待整整10秒,然后再转到下一页.IE似乎表现出相同的行为.这是一个已知的浏览器行为吗?在这种情况下,我能做些什么让用户立即离开页面?提前致谢.
我有一个用C#编写的Windows服务,它会定期激活后台作业.通常,在任何给定时间,几十个重度I/O绑定任务(下载大文件等)并行运行.该服务在一个相对繁忙的Web服务器上运行(目前是必需的),我认为在线程保护方面可以尽可能地使用异步API.
大部分工作都已完成.所有作业现在完全异步(利用HttpClient等),主要作业循环(使用大量Task.Delay)也是如此.剩下的就是弄清楚如何从服务的OnStart正确安全地启动主循环.实际上,这是一个备受关注的呼叫异步同步困境.以下是我到目前为止(非常简化).
在Program.cs中:
static void Main(string[] args) {
TaskScheduler.UnobservedTaskException += (sender, e) => {
// log & alert!
e.SetObserved();
};
ServiceBase.Run(new MyService());
}
Run Code Online (Sandbox Code Playgroud)
在MyService.cs中:
protected override void OnStart(string[] args) {
_scheduler.StartLoopAsync(); // fire and forget! will this get me into trouble?
}
Run Code Online (Sandbox Code Playgroud)
这StartLoopAsync
是对我的呼吁.我不能简单地Wait()
在返回的Task上,因为OnStart需要相对快速地返回.(作业循环需要在一个单独的线程上运行.)想到几个想法:
Task.Run(() => _scheduler.StartLoopAsync().Wait());
吗?_scheduler.StartLoopAsync().ConfigureAwait(false)
在这里打电话会有什么好处吗?(我怀疑它,因为这里没有await
.)为了重用开放的TCP连接,HttpClient
您必须为所有请求共享一个实例.
这意味着我们不能简单地HttpClient
使用不同的设置(例如超时或标头)进行实例化.
我们如何共享连接并同时使用不同的设置?这很简单,实际上是默认的,旧的HttpWebRequest
和WebClient
基础设施.
请注意,HttpClient.Timeout
在发出请求之前简单设置不是线程安全的,并且不能在并发应用程序(例如ASP.NET网站)中工作.
有没有办法在本地开发环境中测试Azure搜索?没有实际连接到Azure.这将离线工作.我正在考虑像Azure存储模拟器这样的东西.
我正在研究用于ASP.NET MVC 2应用程序的构建工具.我喜欢使用脚本语言而不是XML的想法,并将我的选择范围缩小到psake或rake.我对Ruby或PowerShell没有多少经验,但我也愿意学习.如果那是我最好的选择,我不介意在我的构建服务器上安装Ruby.
我的构建没有太复杂或不寻常.它需要从Mercurial仓库中获取源代码,构建Visual Studio 10解决方案,对配置文件进行一些转换,基于Database(Data Dude)项目构建/运行SQL脚本,复制VS的Web Publish,以及做一些其他基本文件同步.
任何人都有可以比较它们的rake和psake的经验吗?一个人在功能方面是否优于另一个,还是仅仅归结为脚本语言偏好?
提前致谢.
编辑:我还没有CI解决方案,但我倾向于使用TeamCity.我以为我会提到它,以防一个构建工具比另一个更好.
因此,我一直在阅读那些使用Subject<T>
"不好"的内容 - 我赞同这种推理.
但是,我试图想出避免使用它的最佳方法并有一个例子.
目前,我有一个持久化配置类的抽象类,它上面有一个受保护的Save()
方法,只要更改属性应该保持该类,就会调用该类.此消息将消息泵送到Subject<T>
通过IObservable<T>
接口公开的消息,该接口由序列化服务侦听并序列化该类.这似乎是当时实现这一目标的最明显,最简单,最快捷的方式.
那么在不使用主题的情况下,RX方式会是什么呢?我是否会公开一个事件并使用Observable.FromEventPattern()
订阅它? - 因为这似乎是一种更复杂的方式.
在ASP.NET Web API应用程序中,我正在使用的一些模型包含一小块ad-hoc JSON,它仅在客户端有用.在服务器上,它只是作为字符串进出关系数据库.性能是关键,根本不需要处理JSON字符串服务器端.
所以在C#中,想象一个像这样的对象:
new Person
{
FirstName = "John",
LastName = "Smith",
Json = "{ \"Age\": 30 }"
};
Run Code Online (Sandbox Code Playgroud)
默认情况下,Json.NET会像这样序列化这个对象:
{
"FirstName": "John",
"LastName": "Smith",
"Json": "{ \"Age\": 30 }"
}
Run Code Online (Sandbox Code Playgroud)
我希望能够指示Json.NET假设该Json
属性已经是序列化表示,因此它不应该重新序列化,并且生成的JSON应如下所示:
{
"FirstName": "John",
"LastName": "Smith",
"Json": {
"Age": 30
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,这适用于两个方向,即在POST JSON表示时,它将自动反序列化为上面的C#表示.
使用Json.NET实现这一目标的最佳机制是什么?我需要定制JsonConverter
吗?是否有一个更简单的基于属性的机制?效率很重要; 重点是跳过序列化开销,这可能是一个微优化,但为了论证,让我们假设它不是.(可能会Json
返回包含大量属性的大列表.)
我正在使用Visual Studio 2008和SQL Server 2008.我希望我的VS项目中的.sql文件默认在SQL Management Studio中打开.到目前为止没问题:我右键单击文件,打开方式,添加SSMS,并将其设置为默认值.我不喜欢的是它每次都会打开一个新的SSMS实例,我希望它在现有实例中打开(如果有的话).
我注意到与Windows中的.sql文件关联的Open命令(具有我想要的行为)使用/ dde开关调用ssms.exe.不确定是什么开关,但我玩它并且它似乎与在现有实例中打开文件没有任何关系.
知道如何在Visual Studio中使用此行为吗?
提前致谢!
我从比我更聪明的人那里多次阅读了这个建议,并且几乎没有注意事项:始终使用ConfigureAwait(false)
内部库代码.所以我很确定我知道答案,但我想成为100%.场景是我有一个库,它包含了一些其他异步库.
图书馆代码:
public async Task DoThingAsyc() {
// do some setup
return await otherLib.DoThingAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
申请代码:
// need to preserve my synchronization context
await myLib.DoThingAync();
// do I have my context here or did my lib lose it?
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×4
async-await ×3
abort ×1
asynchronous ×1
azure ×1
build ×1
javascript ×1
jquery ×1
json ×1
json.net ×1
psake ×1
rake ×1
sql ×1
sql-server ×1
subject ×1