小编Dar*_*rek的帖子

使用Linq to SQL进行多线程处理

由于最初的线程(使用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数据连接.

任何见解和解释将不胜感激.

sql linq parallel-processing linq-to-sql

6
推荐指数
2
解决办法
5320
查看次数

WCF使用,关闭和扩展

我很难过.也许有人可以对我观察到的WCF客户端行为有所了解.

使用WCF示例,我开始使用不同的WCF客户端/服务器通信方法.在并行执行1M测试请求时,我使用SysInternals TcpView来监视开放端口.现在,至少有4种不同的方式来调用客户端:

  1. 创建客户端,做你自己的事情,让GC收集它
  2. 在使用块中创建客户端,而不是你的东西
  3. 在使用块中从工厂创建客户端通道,而不是你的东西
  4. 创建客户端或通道,但使用WCF Extensions来完成您的工作

现在,据我所知,只有选项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)

c# wcf

5
推荐指数
1
解决办法
1128
查看次数

实体框架性能下降

我有一个非常简单的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 => …

sql entity-framework

5
推荐指数
1
解决办法
2903
查看次数

TFS 2010 EventTypes的完整列表是什么?

我写了一个小应用程序试图订阅各种事件,但找不到一个非常好的解释或所有不同事件类型的列表.有谁知道它们是什么?例如,到目前为止我有这些:

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)

任何帮助非常感谢.

tfs tfs2010

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

SSDT 项目中带有 UDF 和视图的数据库参考

遇到一个奇怪的问题。假设一个空解决方案中有两个数据库项目: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)

sql-server-data-tools

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