我知道之前已经问过这些问题,我将首先列出其中一些问题(我到目前为止已经阅读过的):
正如你所看到的那样,关于这个主题的SO本身有一些很好的资源,但是有一个问题/部分的问题,我仍然不确定是否已经阅读了这些内容.
我主要关注IEnumerable和IQueryable问题,更具体地说是DAL与它的消费者之间的耦合.
我发现有关两个接口的建议各不相同,这两个接口都很棒.但是,我关注的是DAL返回IQueryable的含义.据我了解,IQueryable建议/暗示有一个Linq提供商.这是第一个问题 - 如果DAL突然需要来自非Linq提供的数据源,该怎么办?以下方法可行,但它更像是黑客攻击吗?
public static IQueryable<Product> GetAll()
{
// this function used to use a L2S context or similar to return data
// from a database, however, now it uses a non linq provider
// simulate the non linq provider...
List<Product> results = new …Run Code Online (Sandbox Code Playgroud) 我知道有一些现存的问题,它们提供了很好的一般观点.我希望在C#/ VB.Net方面获得一些有关这些观点的实际实现(而不是哲学)的细节.
我有一个WCF服务,除其他外,它接收文件.对于服务的大部分时间而言,这个特定区域实际上只是无所事事 - 当工作确实到来时,它会以极大不同的数量突然到达.
对于收到的每个文件(最多可以是每秒数千个),服务需要在1-10秒(每个)之间处理文件,具体取决于许多其他服务,本地资源和网络IO等待时间.
为了帮助这些突发工作负载的服务,我实现了一个队列系统.每秒收到的数千个文件被放置在队列中.控制器根据队列的大小计算要使用的线程数,直到达到"峰值最大线程数"设置,这将阻止它创建其他线程.这些线程放在线程池中,并重用于循环队列.控制器将; 每隔一段时间 重新计算所需的线程数.如果队列大小减小,则释放相关数量的线程.
我应该达到多少线程?很明显,每次收到一个文件时添加一个新的线程对于缺少一个更好的词来说是愚蠢的 - 性能最多会恶化.当每个核心的CPU利用率仅为10%时,限制线程,似乎也不是资源的最佳使用.
那么,有没有一种合适的方法来确定要限制的线程数?我希望服务可以通过对可用资源进行抽样来确定这一点,但这样做是否会影响性能?我知道常见的答案是监控工作负载,通过反复试验调整计数,直到找到我喜欢的数字,但由于此服务的性质(长时间闲置,然后是高/突发工作负载),可能需要很长时间是时候得到那种信息了.
那么,如果我们将服务器的图像移动到与第一个更快/更慢/不同的不同主机上呢?我必须重新重新整理过程吗?
理想情况下,我所追求的是协调员智能地增加线程池的大小,直到CPU利用率为x%(80%是合理的?90%?99%?).显然,我想这样做而不需要添加超过命中x%所需的线程,否则所有我最终都会遇到的不仅仅是等待IO资源,而是等待彼此.
提前致谢!
相关问题(如果您想要一些通用的想法):
如果我没有让问题变得更加困难,哪里会很有趣?
按照目前的情况,该服务在这些爆发期间定期达到100%cpu.问题是CPU利用率高峰.它从空闲(0-10%)变为100%,然后再次退回.我不确定我能帮到那个 - 理想情况下我不会把它全部带到100%.问题的存在是因为提到的文件实际上是图像,服务过程的一部分是将图像传递给System.Windows.Media黑盒,它为我做了一些复杂的图像处理.
由于IO等待和其他正在进行的处理,因此峰值之间存在间歇.如果达到100%的峰值无法帮助(我知道如何防止这种情况,或者我应该知道)我应该如何针对CPU利用率图表进行研究?经常坐在100%?弹跳在50-100之间?如果我确实通过抽样来确定哪些效果最好,那么是否可以保证切换虚拟服务器的主机在同一个图表中也能发挥最佳效果?
对于那些愿意回答的人,我不会考虑这种复杂性.随意忽略这一部分.然而,任何答案也解释了这种复杂性,甚至答案只是提供如何处理它的提示,我至少会upvote!
哎呀很长的问题 - 抱歉 - 并且感谢您的阅读!
这是一个有点棘手的问题,所以请耐心等待......
我有一个简单的小方法:
Public Overloads Shared Function DoStuff(ByVal path As String) As Boolean
If Not IO.File.Exists(ipath) Then Throw New ArgumentException
Dim result As Boolean
Using fs As FileStream = New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)
' do stuff here, details are not important
fs.Close()
End Using
Return result
End Function
Run Code Online (Sandbox Code Playgroud)
我很欣赏该方法没有显示如何使用流,但细节是无关紧要的,我将在下面解释.
这种方法在类库中很贴心; 我们在各种其他项目中引用的助手.显然,在大多数情况下,代码应该在假设路径有效,可访问等方面看起来很好.
现在,问题.我有一个WCF服务库,它引用并使用Helper程序集中的上述方法.WCF服务库托管在Windows服务中,而Windows服务又驻留在我们的某个服务器上.WCF服务有一个操作,它接收文件的UNC路径,在正常流程中,调用Helper类中的上述方法.
我发送的路径是用于我们网络上的共享文件."使用fs As ..."行失败,但出现以下异常:
System.UnauthorizedAccessException:拒绝访问" 此处列出的文件路径" 路径.在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs) System.IO.FileStream上的System.IO.FileStream..ctor(String path,FileMode …
对不起,如果标题有误导性,不知道如何描述这个.
我的最终目标是要具有的扩展方法IQueryable<T>表达的和某种形式的(见下文的实施例),将允许我不得不返回IQueryable<EntityIndex<T>>(或类似的),其包含原始T的Entity字段,和阵列/ IEnumerable的含有元素正如某种形式的表达所描述的那样.
我知道这没有多大意义,希望它会在一个例子之后......
这是我到目前为止:
class EntityIndex<T, TKey>
{
T Entity { get; set; }
// Doesn't have to be IEnumerable, whatever is easier
IEnuermable<TKey> Index { get; set; }
}
static class Elsewhere
{
[Extension()]
public IQueryable<EntityIndex<T, TKey>> IndexBy<T, TKey>(this IQueryable<T> source, Expression<Func<T, TKey[]>> indexSelector)
{
return source.Select(n => new EntityIndex<T, TKey> {
Entity = n,
Index = new T[] { n }.Select(indexSelector)
});
}
}
Run Code Online (Sandbox Code Playgroud)
注意:上面没有编译,它只是尝试显示我想要实现的目标. …
CREATE TABLE #A (UpperLimit NUMERIC(4))
CREATE TABLE #B (Id NUMERIC(4), Amount NUMERIC(4))
INSERT INTO #A VALUES
(1000), (2000), (3000)
INSERT INTO #B VALUES
(1, 3100),
(2, 1900),
(3, 1800),
(4, 1700),
(5, 900),
(6, 800)
Run Code Online (Sandbox Code Playgroud)
给定这两个表,我想将表 A 连接到 B ON B.Amount < A.UpperLimit,但表 B 中的每条记录只能使用一次,因此所需的输出将是:
我可以通过将表 B 的记录放入临时表中,将光标悬停在表 A 上获取顶部记录 < UpperLimit 并从临时表或其他一些编程解决方案中删除该记录来轻松地做到这一点,但我想避免这种情况,我非常确定这可以通过“正常”(递归 CTE?分区?)查询来完成。
SequenceReader<T>我正在尝试在 .Net Core Preview 8 中使用来解析鳄梨酱协议网络流量。
流量可能如下所示:
5.error,14.some text here,1.0;
这是一个单一错误指令。有3个字段:
errorsome text here0(参见状态代码)这些字段以逗号分隔(以分号终止),但每个字段上也有长度前缀。我想这样你就可以解析类似的东西:
5.error,24.some, text, with, commas,1.0;
产生Reason= some, text, with, commas.
简单的逗号分隔解析很简单(有或没有SequenceReader)。但是,为了利用长度,我尝试了以下操作:
public static bool TryGetNextElement(this ref SerializationContext context, out ReadOnlySequence<byte> element)
{
element = default;
var start = context.Reader.Position;
if (!context.Reader.TryReadTo(out ReadOnlySequence<byte> lengthSlice, Utf8Bytes.Period, advancePastDelimiter: true))
return false;
if (!lengthSlice.TryGetInt(out var length))
return false;
context.Reader.Advance(length);
element …Run Code Online (Sandbox Code Playgroud) 可能真的很简单,请原谅我的无知......
据我所知,有几种Where()扩展方法:
Queryable.Where<TSource> Method (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)
Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)
以上两个扩展都位于System.Linq命名空间中,因此我可以做到Where()足以证明我已经导入了正确的命名空间 - 或者是否有我需要的IQueryable扩展的另一个命名空间?
我理解IQueryable<T>继承自IEnumerable<T>但为什么我不能获得IQueryable<T>扩展?
class Test
{
IQueryable<Test> SomeMethod(Func<T, bool> criteria)
{
return new List<Test> { new Test() }.AsQueryable().Where(criteria); // compiler error converting IEnumerable<T> to IQueryable<T>
}
}
Run Code Online (Sandbox Code Playgroud)
如上所示,应该有一个可用的扩展方法返回IQueryable?为什么它会解析为IEnumerable Extensions?
注:我使用的ExpressionTree游客的衍生物作为解释这里
在我的VisitMemberAccess方法中,我目前使用以下内容创建MemberExpressions:
// `mapping` is a class used to map EntityA's members to EntityB's members
return Expression.MakeMemberAccess(Visit(m.Expression), mapping.TargetMemberInfo);
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,这是有效的.
鉴于一些测试类......
public class EntityA
{
public long Id { get; set; }
public string Name { get; set; }
}
public class EntityB
{
public long MyId {get; set; }
public string MyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
代码将正确映射(EntityA x) => x.Id到(EntityB x) => x.MyId哪个是伟大的,并且工作可爱.引入导航属性时出现问题:
public class EntityB
{ …Run Code Online (Sandbox Code Playgroud) .net-4.0 ×5
c# ×5
.net-3.5 ×1
.net-core ×1
generics ×1
guacamole ×1
ienumerable ×1
iqueryable ×1
linq-to-sql ×1
sql-server ×1
t-sql ×1
threadpool ×1
vb.net ×1
wcf ×1