简短版本:当异步方法在循环中被调用成千上万次时异步调用如何缩放,这些方法可能会调用其他异步方法?我的线程池会爆炸吗?
我一直在阅读和试验TPL和Async,在阅读了很多材料之后,我仍然对某些方面感到困惑,这些方面我找不到太多信息,比如异步调用如何缩放.我会尽力直截了当.
异步调用
对于IO,我读到最好使用异步而不是新线程/启动任务,但据我所知,不使用不同线程执行异步操作是不可能的,这意味着异步必须使用其他线程/启动任务在某一点.所以我的问题是:代码A如何比代码B更好地处理系统资源?
代码A.
// an array with 5000 urls.
var urls = new string[5000];
// list of awaitable tasks.
var tasks = new List<Task<string>>(5000);
HttpClient httpClient;
foreach (string url in urls)
{
tasks.Add(httpClient.GetStringAsync(url));
}
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
代码B.
...same variables as code A...
foreach (string url in urls)
{
tasks.Add(
Task.Factory.StartNew(() =>
{
// This method represents a
// synchronous version of the GetStringAsync.
httpClient.GetString(url);
})
);
} …Run Code Online (Sandbox Code Playgroud) 我找不到自动反序列化(服务器端)所有EmptyOrWhiteSpace字符串到null. Json.Net 默认只是简单地将值赋值给对象属性,我需要逐个字符串验证它是空的还是空白的,然后将其设置为 null。
我需要在反序列化时完成此操作,因此我不必记住验证来自客户端的每个字符串。
如何在 Json Net 上覆盖它?
我正在使用EF和进行一些测试Linq to entities,以尝试提高我的应用程序性能。
我只是注意到一些奇怪的事情(对我来说),我无法解释,也无法真正判断是否会产生相当大的开销。
这是我的链接:
var result = from n in query
orderby n.PersonId
select new
{
id = n.Id,
appointmentId = n.AppointmentId,
message = n.Message,
wasRead = n.Read,
canDismiss = (n.Appointment.Status != AppointmentStatus.Waiting),
date = n.IssueDateUtc
};
Run Code Online (Sandbox Code Playgroud)
这是生成的sql:
SELECT
[Project1].[Id] AS [Id],
[Project1].[AppointmentId] AS [AppointmentId],
[Project1].[Message] AS [Message],
[Project1].[Read] AS [Read],
[Project1].[C1] AS [C1],
[Project1].[IssueDateUtc] AS [IssueDateUtc]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Read] AS [Read],
[Extent1].[Message] AS [Message],
[Extent1].[IssueDateUtc] AS [IssueDateUtc],
[Extent1].[AppointmentId] AS [AppointmentId], …Run Code Online (Sandbox Code Playgroud) 我一直在研究索引并试图了解它们的工作原理以及如何使用它们来提高性能,但我遗漏了一些东西.
我有下表:
人:
| Id | Name | Email | Phone |
| 1 | John | E1 | P1 |
| 2 | Max | E2 | P2 |
Run Code Online (Sandbox Code Playgroud)
我正在尝试找到索引列的最佳方法,Email并Phone考虑到(大多数情况下)查询将是表单的
[1] SELECT * FROM Person WHERE Email = '...' OR Phone = '...'
[2] SELECT * FROM Person WHERE Email = ...
[3] SELECT * FROM Person WHERE Phone = ...
Run Code Online (Sandbox Code Playgroud)
我认为最好的方法是使用两列创建单个索引:
CREATE NONCLUSTERED INDEX [IX_EmailPhone]
ON [dbo].[Person]([Email], [PhoneNumber]);
Run Code Online (Sandbox Code Playgroud)
但是,使用上面的索引,只有查询[2]受益于索引查找,其他查询[2]使用索引扫描.
我还尝试创建多个索引:一个包含两列,一个用于电子邮件,一个用于电子邮件.在这种情况下,[2]和[3]使用seek,但[1]继续使用scan.
为什么数据库不能使用带有或的索引?考虑到查询,该表的最佳索引方法是什么?
假设我有以下日期,时间和时区:2016-10-15, 1:00:00, America/Toronto.
如何创建ZonedDateTime表示指定区域中确切日期和时间的?
基本上我需要一个ZonedDateTime对象来表示确切时区中的确切日期和时间.
如果跳过时间,我想在新时间添加小时标记.例:
如果00:00被跳到1:00,并且我试图在区域中获得00:30的时间,我希望结果是1:30,而不是1:00,这是间隔的第一次.
如果00:00被跳到1:45,并且我试图在区域中获得时间00:20,我希望结果为2:05.
如果时间不明确,即发生两次,我想要早期映射.
c# ×4
asynchronous ×1
datetime ×1
indexing ×1
json.net ×1
linq ×1
nodatime ×1
sql ×1
sql-server ×1