由于最初的线程(使用Linq to SQL的多线程)已经变得很老了,我以为我会在类似的主题上发布另一个问题.考虑一种场景,其中DomainService公开了许多方法来从SQL Server数据库中检索数据.显然,在多用户场景中,同时有多个请求进入,人们不得不期望this.DataContext并行使用,开发人员无需控制或额外的工作来处理这些多个请求.那么,如果我将顺序的LINQ查询放入Parallel.Invoke()中,那么所有的地狱都会破裂,我得到的是"已经有一个与此命令关联的开放DataReader,必须首先关闭它".错误......?
为了演示,这有效:
List<Data> retVal = new List<Data>();
retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList());
retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList());
retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D}).ToList());
Run Code Online (Sandbox Code Playgroud)
......但这不是:
List<Data> retVal = new List<Data>();
Parallel.Invoke(
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList()),
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList()),
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D})).ToList());
Run Code Online (Sandbox Code Playgroud)
不要介意List不是线程安全的,因为错误来自SQL数据连接.
任何见解和解释将不胜感激.
我很难过.也许有人可以对我观察到的WCF客户端行为有所了解.
使用WCF示例,我开始使用不同的WCF客户端/服务器通信方法.在并行执行1M测试请求时,我使用SysInternals TcpView来监视开放端口.现在,至少有4种不同的方式来调用客户端:
现在,据我所知,只有选项2-4,显式调用client.Close().在执行期间,我看到许多端口处于TIME_WAIT状态.由于依赖GC,我期望选项1成为最糟糕的情况.然而,令我惊讶的是,它似乎是最干净的,这意味着,它不会留下任何挥之不去的端口.
我错过了什么?
更新:源代码
private static void RunClientWorse(ConcurrentBag<double> cb)
{
var client = new CalculatorClient();
client.Endpoint.Address = new EndpointAddress("net.tcp://localhost:8000/ServiceModelSamples/service");
RunClientCommon(cb, client);
}
private static void RunClientBetter(ConcurrentBag<double> cb)
{
using (var client = new CalculatorClient())
{
client.Endpoint.Address = new EndpointAddress("net.tcp://localhost:8000/ServiceModelSamples/service");
RunClientCommon(cb, client);
}
}
private static void RunClientBest(ConcurrentBag<double> cb)
{
const string Uri = "net.tcp://localhost:8000/ServiceModelSamples/service";
var address = new EndpointAddress(Uri);
//var binding = new NetTcpBinding("netTcpBinding_ICalculator");
using (var factory = new ChannelFactory<ICalculator>("netTcpBinding_ICalculator",address))
{ …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的edmx模型,一个数据库和一个实体用于一个数据库表.测试从本地虚拟数据库服务器顺序检索所有记录.
using System;
using System.Linq;
namespace ConsoleApplication1
{
using System.Diagnostics;
private static readonly ConcurrentBag<long> Stats = new ConcurrentBag<long>();
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
var sw = Stopwatch.StartNew();
using (var ctx = new ScratchEntities())
{
foreach (var invoice in ctx.Invoices.Select(
s => new
{
s.Id,
s.Amount,
s.DueDate
}))
{
}
}
sw.Stop();
Stats.Add(sw.ElapsedMilliseconds);
}
Console.WriteLine("Min {0} Max {1} Avg {2}", Stats.Min(), Stats.Max(), Stats.Average());
}
}
Run Code Online (Sandbox Code Playgroud)
在EF 4和5下,执行大约需要2-2.5秒.升级到Nuget的EF6,差不多10秒.
在类似的说明中,与foret over ctx.Invoices.Select(s => …
我写了一个小应用程序试图订阅各种事件,但找不到一个非常好的解释或所有不同事件类型的列表.有谁知道它们是什么?例如,到目前为止我有这些:
var eventService = this.projectCollection.GetService(typeof(IEventService)) as IEventService;
this.subscriptions.Add(eventService.SubscribeEvent("WorkItemChangedEvent", "", delPref));
this.subscriptions.Add(eventService.SubscribeEvent("BuildCompletionEvent", "", delPref));
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.
遇到一个奇怪的问题。假设一个空解决方案中有两个数据库项目:Bart 和 Homer。巴特已被添加为荷马的数据库参考。
Bart项目定义了一个函数:
CREATE FUNCTION [dbo].[Message]()
RETURNS NVARCHAR(255)
AS
BEGIN
RETURN 'I am a value returned from another database'
END
Run Code Online (Sandbox Code Playgroud)
然后Homer项目定义了一个表:
CREATE TABLE [dbo].[Messages]
(
[Id] INT NOT NULL PRIMARY KEY
)
Run Code Online (Sandbox Code Playgroud)
和一个视图:
CREATE VIEW [dbo].[MessagesV]
AS SELECT Id, Bart.dbo.Message() AS [Message]
FROM dbo.Messages
Run Code Online (Sandbox Code Playgroud)
当尝试构建时,我收到以下错误:
Error 2 SQL71501: Computed Column: [dbo].[MessagesV].[Message]
contains an unresolved reference to an object. Either the object does
not exist or the reference is ambiguous because it could refer to any
of the following objects: …Run Code Online (Sandbox Code Playgroud)