我正在使用System.Net.Http的HttpClient使用以下代码使用"POST"调用REST API:
using (HttpRequestMessage requestMessage = new HttpRequestMessage(
HttpMethod.Post, new Uri(request)) { })
{
response = await httpClient.PostAsync(request, objectContent);
}
Run Code Online (Sandbox Code Playgroud)
"objectContent"目前是这个 -
objectContent = new ObjectContent(jsonContent.GetType(),
jsonContent,
new JsonMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)
我想知道如果这是一个StringContent而不是像这样的ObjectContent会有什么不同?
objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
Run Code Online (Sandbox Code Playgroud)
两者都很好.因为它是JSON,我倾向于认为StringContent是有意义的.但是什么时候使用ObjectContent,因为几乎所有发送的内容都是"字符串".
我们有一个SQL服务器,有大约40个不同的(每个约1-5GB)数据库.该服务器是一个8核2.3G CPU,32G的RAM.27Gig固定到SQL Server.CPU使用率总是接近100%,内存消耗约为95%.这里的问题是CPU经常接近100%,并试图了解原因.
我已经运行了初步检查,看看哪个数据库通过使用 - 这个脚本有助于高CPU,但我无法详细说明真正消耗CPU的数据.最高查询(来自所有数据库)只需要大约4秒钟即可完成.IO也不是瓶颈.
记忆会成为罪魁祸首吗?我检查了内存分裂,OBJECT CACHE占用了大约80%的内存分配(27G)到SQL Server.如果涉及到很多SP,我希望这是正常的.运行探查器,我看到很多的重新编译,但主要是由于"临时表改变","延迟编译"等,并是不明确的,如果这些重新编译是计划的结果是越来越抛出缓存因内存压力
欣赏任何想法.
我已经阅读了SO中的所有相关问题,但对于我的场景中触发多个Web服务调用的最佳方法有点困惑.
我有一个聚合器服务,它接受输入,解析并将其转换为多个Web请求,进行Web请求调用(不相关,因此可以并行触发)并合并发送回调用者的响应.现在使用以下代码 -
list.ForEach((object obj) =>
{
tasks.Add(Task.Factory.StartNew((object state) =>
{
this.ProcessRequest(obj);
}, obj, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default));
});
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
在await Task.WhenAll(tasks)来自斯科特Hanselman的帖子在那里说,
斯蒂芬说:"从可伸缩性的角度来看,更好的解决方案是利用异步I/O.当你通过网络呼叫时,没有理由(除了方便之外)在等待响应来阻止线程时背部"
现有代码似乎消耗了太多线程,并且处理器时间在生产负载上高达100%,这让我思考.
另一个替代方法是使用Parallel.ForEach,它使用分区器,但也"阻塞"调用,这对我的场景来说很好.
考虑到这是所有"异步IO"工作而不是"CPU绑定"工作,并且Web请求不会长时间运行(最多返回3秒),我倾向于认为现有代码足够好.但是这会提供比Parallel.ForEach更好的吞吐量吗?Parallel.ForEach可能使用"最小"数量的任务,因为分区因此最佳使用线程(?).我用一些本地测试测试了Parallel.ForEach,它似乎没有更好.
目标是减少CPU时间并提高吞吐量,从而提高可扩展性.是否有更好的方法来并行处理Web请求?
感谢任何投入.
编辑: 代码示例中显示的ProcessRequest方法确实使用HttpClient及其异步方法来触发请求(PostAsync,GetAsync,PutAsync).
c# parallel-processing multithreading task-parallel-library parallel.foreach
我看到"快速监视"窗口可以访问所有属性,而不管库中类的访问限制(内部,受保护,私有),即使在完全不同的应用程序,库和命名空间中引用库也是如此.虽然我没有找到使用"反射"访问这些的方法.我特别想"阅读"(注意 - 只是阅读)程序集的内部属性.如果通过设计"内部"如何工作(在同一命名空间外无法访问),这是不可能的,那么VS.NET中的"快速监视"窗口是如何"读取"的呢?
这是我使用的示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestLib
{
public class TestInteralProp
{
internal string PropertyInternal
{
get { return "Internal Property!"; }
}
protected string PropertyProtected
{
get { return "Protected Property!"; }
}
string PropertyPrivate
{
get { return "Private Property!"; }
}
public string PropertyPublic
{
get { return "Public Property!"; }
}
protected internal string PropertyProtectedInternal
{
get { return "Protected Internal Property!"; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我为TestInernalProp类创建一个对象时,我可以在quickwatch中看到所有4个属性 -

当我使用反射访问除公共属性(PropertyPublic)之外的任何这些,我得到一个空引用异常. …
我有一个场景,屏幕上的用户操作导致在大约50个不同的表中实时创建新记录.用例的设计使得用户操作创建的新记录立即需要用户进行更改.所以没有离线或延迟创作的可能性.
话虽如此,显而易见的问题是 - 插入语句(以及一些额外的操作语句)都在事务中,这使得它成为一个非常冗长的事务.这将运行大约30秒,通常会导致超时或阻止其他查询.
原子性需要交易.有没有更好的方法可以拆分事务并保持一致性?或任何其他方法来改善目前的情况?
我的一位客户报告他们的目标网页加载缓慢.他们将ASP.NET MVC与Kendo UI结合使用.我做了一个快速检查,发现kendo.all.min.js约为1.8MB,客户说这是必需的.我确信他们不会在目标网页中使用所有的kendo UI元素.我之前从未使用过Keno但只使用过JQuery.有没有办法通过不包括所有内容来进一步最小化kendo脚本文件大小,只选择所需的元素并形成最终的JS(如在JQuery中挑选樱桃?).
谢谢!
c# ×3
sql-server ×2
cpu-usage ×1
httpclient ×1
internal ×1
json ×1
kendo-ui ×1
performance ×1
properties ×1
protected ×1
sql ×1
transactions ×1