小编Joh*_*ell的帖子

VBCSCompiler.exe的大量实例

我刚刚下载并安装了Visual Studio Professional 2015(14.0.23107.0).我第一次打开解决方案(28个项目)并执行构建 - >重建解决方案时,我的开发机器出现了绝对的爬行现象.CPU的最大值为100%,构建从未完成 - 即使在> 10分钟后也是如此.

我打开了Windows任务管理器并注意到:> 10个VBCSCompiler.exe任务正在运行.合并后,这些任务使CPU> 90%.

知道为什么有这么多这些任务在运行吗?有什么方法可以阻止这种情况发生?

这是我能遇到同样问题的其他人最接近的事情:https://github.com/dotnet/roslyn/issues/2790

更新(8/7)

-Hans Passant,很棒的想法.我的经理向我提供了这个版本(14.0.23107.0).这是"官方发布"的正确版本吗?我并没有故意安装任何Visual Studio 2015的每个版本.我不认为有任何beta版本.

-Kyle Trauberman,我对Visual Studio环境中的环境变量并不熟悉; 然而,我天真地跑了set DisableRosyln=true在VS(和MSBuild)命令提示符窗口中运行.这似乎没有任何影响.即使重启VS2015,VBCSCompiler.exe也会显示正确的备份.

我修复了我的VS2015安装并执行了重启.这没有用.

更新第2部分(8/7) Passant,非常令人印象深刻的写作!虽然这次问题没有发生,但我看了你描述的事情:

至于加载了VBCSCompiler.exe的模块,这就是我所拥有的:

在此输入图像描述

有趣的是,我们的.NET核心程序集有不同的版本.你的赔率是4.06.79,而我是4.06.81.

我的"客户端dll"(位于C:\ Program Files(x86)\ MSBuild\14.0\Bin\Microsoft.Build.Tasks.CodeAnalysis.dll)与您的版本和时间戳相同: 在此输入图像描述

奇怪的是,当我查看ILSpy中的代码时,我看到一些略有不同的东西 - 也许是优化?

    private static NamedPipeClientStream TryAllProcesses(string pipeName, int timeoutMs, CancellationToken cancellationToken, out string newPipeName)
{
    string str = pipeName;
    int num = 1;
    while (File.Exists(string.Format("\\\\.\\pipe\\{0}", pipeName)))
    {
        NamedPipeClientStream result;
        if ((result = BuildClient.TryConnectToProcess(pipeName, timeoutMs, cancellationToken)) != null)
        {
            newPipeName = pipeName; …
Run Code Online (Sandbox Code Playgroud)

.net c# roslyn visual-studio-2015

58
推荐指数
3
解决办法
3万
查看次数

实体框架拆分表删除

我正在使用EF 4 STE来为Attachment对象建模.该附件包含了名称,描述,日期,以及最重要的数据(byte[]).为了优化加载,我不想在绝对必要之前检索Data属性,即当用户Download从客户端点击时.

为了遵循这种方法,我使用了这里描述的表拆分技术.我将附件表拆分为附件(名称,描述,日期)和附件数据(数据).这是我EF模型中的一对一关系.直到我尝试删除一切都很正常附件没有AttachmentData(即attachment.AttachmentData == null).我得到以下异常:

遇到无效数据.缺少必需的关系.检查StateEntries以确定约束违规的来源.

我看到了类似的帖子,但我似乎无法使用STE和ApplyChanges扩展方法.

现在我的数据访问代码很简单:我调用上下文ApplyChanges()后跟SaveChanges().

我尝试了一个简单的删除SQL函数,并将其映射到两个实体,并实际工作; 但它打破了插入物.我似乎无法将所有属性的插入函数映射到两个实体.

关于我可以尝试的其他一些选项的任何想法?Attachment和AttachmentData之间的关系可以是可选的吗?当我将其设为1到0+时,我得到一个映射错误Their primary keys may collide.

对任何建议开放.

谢谢!

c# sql entity-framework entity-framework-4 self-tracking-entities

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

WCF:单个服务的多个绑定配置

我正在开发一个必须支持向后兼容性的客户端 - 服务器应用程序(.NET 4 WPF,WCF).换句话说,就操作合同和数据合同而言,旧客户端应与新服务器兼容(反之亦然).

我们的WCF服务托管在IIS中,他们设置为使用basicHttpBinding的:

<basicHttpBinding>
   <binding name="basicHttpBinding_Configuration" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
         maxArrayLength="2147483647" />
      <security mode="None" />
   </binding>
</basicHttpBinding>

...

<service behaviorConfiguration="SampleGateway.Data.DataAccessBehavior"
   name="SampleGateway.Data.DataAccess">
   <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_Configuration"
      contract="Sample.Data.IDataAccess" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      <host>
      <baseAddresses>
         <add baseAddress="http://localhost:8731/Design_Time_Addresses/SampleGateway/SampleGateway.Data.DataAccess.svc" />
      </baseAddresses>
   </host>
</service>

...

<behavior name="SampleGateway.Data.DataAccessBehavior">
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="false" />
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
Run Code Online (Sandbox Code Playgroud)

假设合同非常基本,看起来像这样:

[ServiceContract]
public interface IDataAccess
{
   [OperationContract]
   List<Data> GetData(List<int> ids, DateTime startDateTime, DateTime endDateTime);
}
Run Code Online (Sandbox Code Playgroud)

最近,我发现我们可以将编码从更改XMLbinary.结合IIS压缩,这确实提高了我们的WCF方法的性能,例如上面列出的GetData.

此编码更改还需要更改客户端和服务器WCF绑定,从a切换 …

.net wcf wcf-binding

13
推荐指数
1
解决办法
3万
查看次数

T-SQL:使用TIES进行分页

我正在尝试实现一个稍微不同的分页例程.

为了一个简单的例子,我们假设我有一个表定义并填充如下:

DECLARE @Temp TABLE
(
    ParentId    INT,
    [TimeStamp] DATETIME,
    Value       INT
);

INSERT INTO @Temp VALUES (1, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (1, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (1, '1/1/2013 02:00', 8);
INSERT INTO @Temp VALUES (2, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (2, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (2, '1/1/2013 02:00', 8);
INSERT INTO @Temp VALUES (3, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (3, '1/1/2013 01:00', 7);
INSERT INTO @Temp …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server-2008

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

WCF服务方法中单例模式的问题

我将继续前言,并说:我对WCF有些新意.

我正在研究一个服务器端例程,它负责执行大量的业务逻辑.它可以通过WCF从客户端访问.

我的主要WCF方法调用其他几个私有方法.我决定使用包含所有这些"查找数据"的名为DataProvider的类的单例实例,而不是传递每个私有方法的业务逻辑所需的所有"查找数据".

在例程结束时,我"释放"DataProvider的查找数据,以便下次执行例程时,将使用最新的查找数据.

所以,这是一个简化的例子:

 public void Generate()
 {
      try
      {
           //populate singleton DataProvider with it's lookup data...
           DataProvider.Instance.LoadLookupData();

           //do business logic...
      }
      finally
      {
           //release provider's lookup data...
           DataProvider.Release();
      }
 }
Run Code Online (Sandbox Code Playgroud)

这很有效,直到我有两个不同的客户端在同一时间(或接近)执行该方法.出现问题是因为它们共享相同的单例实例,并且首先完成的任务将在另一个完成之前释放DataProvider.

所以...

我有什么选择?

我想避免传递所有的查找数据,因此单例模式(或某些衍生物)似乎是一个不错的选择.我还需要能够支持同时调用该方法的多个客户端.

我相信WCF服务配置为"Per-Call".我不确定是否有办法配置WCF服务,以便在服务调用之间不共享静态内存.

任何帮助,将不胜感激.

.net c# wcf singleton web-services

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

WCF - 进行多次调用时随机客户端超时

我有一个WPF客户端通过WCF托管的服务请求数据IIS 7.服务方法SQL 2012使用存储过程()EF来检索一些数据.

需要加载大量数据,因此客户端会对服务方法进行多次调用,以"分解"数据加载并避免大量有效负载和超时.

我们使用从中扩展而来的生成的服务代理 System.ServiceModel.ClientBase<T>.

我们还使用带有二进制编码的自定义http绑定(从这里开始) - 这里显示的实际实现:

<customBinding>
   <binding name="CustomBinding_IPointDataAccess" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
      <binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" maxSessionSize="2048">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
      </binaryMessageEncoding>
      <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
         maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous" realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" useDefaultWebProxy="true" />
   </binding>
Run Code Online (Sandbox Code Playgroud)

此外,在IIS中打开动态压缩.我可以在Fiddler中查看请求,并且消息正文的大小很好(~50KB),99%的请求在一两秒内返回.完善!

然而,几乎每次迭代都会有一个电话需要几分钟才能完成,而我不知道为什么......我sendTimeOut在客户端的时间是1分钟,自然而然,一个电话会失败.我把它延长到10分钟,电话似乎在2分多钟内完成 - 虽然有时需要更长时间.这个问题看起来非常随机 - 可能是第一次通话,可能是第30次通话.但它非常可重复.

我在WCF服务方法中对存储过程调用进行了一些日志记录,并在一秒钟内执行并获取数据.所以,我不认为这是一个数据库问题.

使用Fiddler,有问题的调用生成类似于以下内容的输出:

ACTUAL PERFORMANCE
--------------
ClientConnected:     14:02:42.959
ClientBeginRequest:  14:03:01.224
GotRequestHeaders: …
Run Code Online (Sandbox Code Playgroud)

.net wcf http fiddler

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

IIS StackOverflow异常

这是同一问题的另一个变体,其中由于在IIS下运行时256K堆栈大小而发生StackOverflow异常.这个问题并不是什么新鲜事,已被多次询问(这里这里)

我的问题有点不同.当客户端请求数据并且在IIS 7下运行的WCF服务尝试序列化相当大的对象图时,抛出异常.它实际上发生在序列化过程中

通过在具有有限堆栈大小的线程中运行检索/序列化例程,我可以轻松地在开发环境中重现该问题:

static void Main(string[] args)
{
   Thread t = new Thread(DoWork, 262144);
   t.Start();
   t.Join();
   Console.ReadLine();
}

private static void DoWork()
{
   var dataAccess = new DataAccess();

   var data = dataAccess.LoadData();

   var serializer = new DataContractSerializer(typeof(List<Data>), null, int.MaxValue, false, true, new DataContractSurrogate());

   var memoryStream = new MemoryStream();
   serializer.WriteObject(memoryStream, data );
}
Run Code Online (Sandbox Code Playgroud)

这模拟了StackOverflow异常,就像在IIS中一样.当我将传递给Thread的构造函数的stackSize参数更改为1MB时,它工作正常......

我的问题是如何在WCF服务方法中执行此操作?换句话说,在我的WCF服务方法中,我没有显式创建序列化程序并调用WriteObject.如何/在哪里可以在我可以控制stackSize的线程中进行同样的工作?

谢谢!

c# stack-overflow iis wcf

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

Windows用户的DacServices ExportBacpac异常

我正在使用数据层应用程序框架(DACFx)尝试从我的数据库中的表的子集导出模式和数据.

var dacServices = new DacServices(connectionString);
dacServices.ExportBacpac("database.bacpac", database, tables);
Run Code Online (Sandbox Code Playgroud)

我知道支持的内容有一些限制,我已经解决了与代码(存储过程等)有关的问题.但是,我已经使用Windows用户/登录进行了阻止.我不确定如何绕过它.

例外细节:

One or more unsupported elements were found in the schema used as part of a data package.
Error SQL71564: The element User: [Domain\User] has property AuthenticationType set to a value that is not supported in Microsoft Azure SQL Database v12.
Error SQL71564: The element Login: [Domain\User] has property IsMappedToWindowsLogin set to a value that is not supported in Microsoft Azure SQL Database v12.
Run Code Online (Sandbox Code Playgroud)

我发现Azure SQL不支持Windows身份验证.但是没有选择简单地忽略用户,登录等吗?

我已经阅读了各种帖子,声称你可以只登录登录和用户.然后在导出后重新创建它们.不幸的是,我不能这样做,因为这些对象被用于活动连接.我还读到有些人通过备份/恢复然后将用户放在辅助设备上来解决这个问题.这可能会起作用,但肯定会有更好的方法,而不是努力.

解编译代码,我可以看到ExportBacpac方法创建的位置:

DacExtractOptions …
Run Code Online (Sandbox Code Playgroud)

c# sql-server dac

7
推荐指数
0
解决办法
381
查看次数

跟踪多个BackgroundWorkers

我有一个WPF应用程序,我正在使用一个BackgroundWorker组件从后端检索一些数据并在UI中显示它.

BackgroundWorkerWorkerReportsProgress = true这样的UI可以定期更新.该BackgroundWorkerWorkerSupportsCancellation = true,以便它可以被用户取消.一切都很好!

我在尝试实现第三个更复杂的行为时遇到了麻烦.基本上,用户需要具有BackgroundWorker在任何时间开始新任务的灵活性,包括当前正在执行的任务.如果任务当前正在执行并且启动了新任务,则需要将旧任务标记为Aborted.Aborted任务是从不同Cancelled的是Aborted不允许进行任何进一步的UI更新.应该"默默地取消".

我包裹BackgroundWorker里面AsyncTask类,并增加了IsAborted一点.检查IsAborted内部的位ProgressChangedRunWorkerCompleted防止进一步的UI更新.大!

但是,这种方法会崩溃,因为当启动新任务时,CurrentTask会替换为新的实例AsyncTask.结果,跟踪变得困难CurrentTask.

如上所述,在开始新任务之前,TODO:我几乎想要等到CurrentTask中止之后完成.但我知道这将提供糟糕的用户体验,因为UI线程将被阻止,直到旧任务完成.

有没有更好的方法来跟踪多个AsyncTasks确保新的可以按需启动,旧的正确中止而没有进一步的UI更新?似乎没有一种很好的方法来跟踪CurrentTask ... TPL是否提供了更好的方法来处理我所追求的内容?

以下是我在Window类中的重要片段:

private AsyncTask CurrentTask { get; set; }

private class AsyncTask
{
   private static int Ids { get; set; }

   public …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf backgroundworker task-parallel-library

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

TSQL:NOCHECK CREATE TABLE中的外键

我想在我的CREATE TABLE语句中添加一个外键约束.但是,我还想包含NOCHECK属性.这可以在CREATE TABLE语句中的一次传递中完成吗?我似乎无法找到一个好例子.

所以,像:

CREATE TABLE dbo.SampleTable (
   [ID] INT IDENTITY (1,1) NOT NULL,
   [ParentSampleTableID] INT NOT NULL,
   <NOCHECK> CONSTRAINT [FK_SampleTable_ParentSampleTable] FOREIGN KEY (ParentSampleTableID) REFERENCES dbo.ParentSampleTable ([ID])
)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

t-sql sql-server

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

MemoryStream麻烦

我在使用MemoryStream时遇到了一些麻烦

我们正在使用第三方电子表格组件(类似于excel),我正在尝试将数据保存为他们通过以下SaveHtml方法支持的html .根据他们的文档看起来非常简单.这是我的代码:

using (var memoryStream = new MemoryStream())
{
   this.ActiveSheet.SaveHtml(memoryStream);

   memoryStream.Position = 0;

   using (var streamReader = new StreamReader(memoryStream))
   {
       var htmlData = streamReader.ReadToEnd();
   }
}
Run Code Online (Sandbox Code Playgroud)

当我设置时,我得到一个例外memoryStream.Position = 0:

System.ObjectDisposedException: Cannot access a closed Stream.

快速浏览一下Reflector中的SaveHtml方法,可以看到以下相关内容:

public void SaveHtml(Stream stream)
{
    StreamWriter writer = null;

    try
    {
        writer = new StreamWriter(stream) { AutoFlush = true };

        writer.Write(str);
    }   
    finally
    {
        if (writer != null)
        {
            writer.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜是因为streamWriter被他们的代码关闭了,我们运气不好.关闭streamWriter,关闭底层Stream,对吧?

有办法解决这个问题吗?

谢谢.

.net c# memorystream stream

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

Visual Studio 2010数据库项目中的条件文件组文件脚本

我有一个Visual Studio 2010数据库项目.在项目内部,我添加了两个存储 - >文件组文件脚本:一个用于我的主数据文件(.mdf),另一个用于我的日志文件(.ldf).这将在未来扩展.

在此输入图像描述

现在,将这两个文件Build Action设置为Build.

每个文件的内容都很简单.我真正创建它们的唯一原因是完全控制它们的文件名.

Primary.sql:

ALTER DATABASE [$(DatabaseName)]
ADD FILE
    (
        NAME = [Primary],
        FILENAME = '$(DefaultDataPath)$(DefaultFilePrefix).mdf'
    );
Run Code Online (Sandbox Code Playgroud)

Log.sql:

ALTER DATABASE [$(DatabaseName)]
    ADD LOG FILE
        (
            NAME = [Log],
            FILENAME = '$(DefaultLogPath)$(DefaultFilePrefix)_Log.ldf'
        );
Run Code Online (Sandbox Code Playgroud)

当我发布我的数据项目以在幕后创建新数据库时,将呈现以下TSQL/SQLCMD.这正是我想要的:

PRINT N'Creating $(DatabaseName)...'
GO
CREATE DATABASE [$(DatabaseName)]
    ON 
    PRIMARY(NAME = [Primary], FILENAME = '$(DefaultDataPath)$(DefaultFilePrefix).mdf')
    LOG ON (NAME = [Log], FILENAME = '$(DefaultLogPath)$(DefaultFilePrefix)_Log.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS
GO
Run Code Online (Sandbox Code Playgroud)

但是,当我将更改发布到现有数据库时(例如,我添加了一个新表),将呈现以下TSQL/SQLCMD:

PRINT N'Creating [Primary]...';
GO
ALTER DATABASE [$(DatabaseName)]
    ADD FILE (NAME = [Primary], …
Run Code Online (Sandbox Code Playgroud)

sql-server visual-studio-2010 visual-studio

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

仅当使用二进制序列化时 WCF 超时

我们有一个 .NET 4.0 WPF 客户端应用程序,它使用 WCF 与服务器组件(托管在 IIS 中)进行通信。大多数通信是使用basicHttpBindingSOAP 完成的(内容类型:text/xml);然而,出于性能原因,一个端点被切换为使用customBinding二进制序列化(内容类型:application/soap+msbin1)。

因此,以“.svc”结尾的旧 URL 现在具有额外的“/binary”扩展名,例如“.svc/binary”。

到现在为止,这已经运行了 2 年,没有出现任何问题。

有一天,我接到一个客户的电话,看起来好像有什么东西正在“阻止”使用这个支持二进制的端点进行的呼叫。奇怪的是,它们不仅会彻底失败,而且会超时,即使我将超时延长到 5 分钟之类的疯狂值,调用最终也会超时。然而,一旦我切换回basicHttpBinding,几乎自动地,一切都开始工作得很好!

这可能是网络安全软件吗?客户端配置?IIS 设置?我真的不知道什么会阻止这个......

还有其他人经历过类似的事情吗?

这是客户端配置文件中的 customBinding:

<customBinding>
        <binding name="CustomBinding_IDataAccess" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00">
          <binaryMessageEncoding maxReadPoolSize="2147483647" maxSessionSize="2147483647" maxWritePoolSize="2147483647">
            <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647"/>
          </binaryMessageEncoding>
          <httpTransport transferMode="Streamed" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" useDefaultWebProxy="true"/>
        </binding>
      </customBinding>
Run Code Online (Sandbox Code Playgroud)

此外,快速浏览一下 IIS 日志,会显示该端点的大量条目: Request_CancelledTimer_EntityBody等。

日志文件中没有其他端点有消息。

.net c# iis wcf

5
推荐指数
0
解决办法
252
查看次数