小编Tod*_*ier的帖子

取消HttpClient请求 - 为什么TaskCanceledException.CancellationToken.IsCancellationRequested为false?

给出以下代码:

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.IsCancellationRequestedtrue在catch块内,但事实并非如此.我误会了什么吗?

.net c# async-await cancellationtokensource dotnet-httpclient

30
推荐指数
1
解决办法
2万
查看次数

即使在调用abort之后浏览器也会等待ajax调用完成(jQuery)

我有一些(可能)长时间运行的ajax调用,如果用户导航到另一个页面,我想中止.以下jQuery代码在导航离开页面时调用所有挂起的XMLHttpRequest对象的中止:

$.ajaxSetup({
    beforeSend: function(xhr) {
        $(window).bind('beforeunload', function() {
            xhr.abort();
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

在测试用例中,我强制在被调用的服务器端操作上等待10秒.使用Firebug,我确认上面的代码确实导致所有挂起的ajax调用在我单击页面上的任何链接时立即停止.但是,浏览器仍然等待整整10秒,然后再转到下一页.IE似乎表现出相同的行为.这是一个已知的浏览器行为吗?在这种情况下,我能做些什么让用户立即离开页面?提前致谢.

javascript jquery xmlhttprequest onbeforeunload abort

29
推荐指数
2
解决办法
1万
查看次数

从Windows服务调用异步方法

我有一个用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需要相对快速地返回.(作业循环需要在一个单独的线程上运行.)想到几个想法:

  • 通过将该处理程序放在Main中,我是否覆盖了未被观察到的异常?
  • 使用Task.Run会有什么好处Task.Run(() => _scheduler.StartLoopAsync().Wait());吗?
  • _scheduler.StartLoopAsync().ConfigureAwait(false)在这里打电话会有什么好处吗?(我怀疑它,因为这里没有await.)
  • 在这种情况下使用Stephen Cleary的AsyncContextThread会有什么好处吗?我还没有看到任何使用它的例子,因为我开始一个无限循环,我不知道同步回到某些上下文甚至是相关的.

c# asynchronous windows-services async-await

25
推荐指数
2
解决办法
2万
查看次数

重新使用HttpClient但每个请求有不同的超时设置?

为了重用开放的TCP连接,HttpClient您必须为所有请求共享一个实例.

这意味着我们不能简单地HttpClient使用不同的设置(例如超时或标头)进行实例化.

我们如何共享连接并同时使用不同的设置?这很简单,实际上是默认的,旧的HttpWebRequestWebClient基础设施.

请注意,HttpClient.Timeout在发出请求之前简单设置不是线程安全的,并且不能在并发应用程序(例如ASP.NET网站)中工作.

.net dotnet-httpclient

24
推荐指数
2
解决办法
5714
查看次数

本地Azure搜索开发

有没有办法在本地开发环境中测试Azure搜索?没有实际连接到Azure.这将离线工作.我正在考虑像Azure存储模拟器这样的东西.

azure azure-cognitive-search

19
推荐指数
1
解决办法
2343
查看次数

针对.NET构建的psake与rake

我正在研究用于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.我以为我会提到它,以防一个构建工具比另一个更好.

.net rake build psake

18
推荐指数
2
解决办法
3239
查看次数

如何避免在RX中使用Subjects

因此,我一直在阅读那些使用Subject<T>"不好"的内容 - 我赞同这种推理.

但是,我试图想出避免使用它的最佳方法并有一个例子.

目前,我有一个持久化配置类的抽象类,它上面有一个受保护的Save()方法,只要更改属性应该保持该类,就会调用该类.此消息将消息泵送到Subject<T>通过IObservable<T>接口公开的消息,该接口由序列化服务侦听并序列化该类.这似乎是当时实现这一目标的最明显,最简单,最快捷的方式.

那么在不使用主题的情况下,RX方式会是什么呢?我是否会公开一个事件并使用Observable.FromEventPattern()订阅它? - 因为这似乎是一种更复杂的方式.

c# subject system.reactive

12
推荐指数
1
解决办法
1069
查看次数

Json.NET - 阻止重新序列化已经序列化的属性

在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返回包含大量属性的大列表.)

c# serialization json json.net asp.net-web-api

11
推荐指数
1
解决办法
4150
查看次数

Visual Studio - 在现有SSMS窗口中使用SQL Management Studio打开SQL文件?

我正在使用Visual Studio 2008和SQL Server 2008.我希望我的VS项目中的.sql文件默认在SQL Management Studio中打开.到目前为止没问题:我右键单击文件,打开方式,添加SSMS,并将其设置为默认值.我不喜欢的是它每次都会打开一个新的SSMS实例,我希望它在现有实例中打开(如果有的话).

我注意到与Windows中的.sql文件关联的Open命令(具有我想要的行为)使用/ dde开关调用ssms.exe.不确定是什么开关,但我玩它并且它似乎与在现有实例中打开文件没有任何关系.

知道如何在Visual Studio中使用此行为吗?

提前致谢!

sql sql-server visual-studio

10
推荐指数
1
解决办法
9675
查看次数

库中的ConfigureAwait(false)是否会丢失调用应用程序的同步上下文?

我从比我更聪明的人那里多次阅读了这个建议,并且几乎没有注意事项:始终使用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)

.net c# task-parallel-library async-await

10
推荐指数
1
解决办法
672
查看次数