小编GP.*_*GP.的帖子

实现线程安全字典的最佳方法是什么?

我能够通过从IDictionary派生并定义一个私有的SyncRoot对象,在C#中实现一个线程安全的Dictionary:

public class SafeDictionary<TKey, TValue>: IDictionary<TKey, TValue>
{
    private readonly object syncRoot = new object();
    private Dictionary<TKey, TValue> d = new Dictionary<TKey, TValue>();

    public object SyncRoot
    {
        get { return syncRoot; }
    } 

    public void Add(TKey key, TValue value)
    {
        lock (syncRoot)
        {
            d.Add(key, value);
        }
    }

    // more IDictionary members...
}
Run Code Online (Sandbox Code Playgroud)

然后,我在整个消费者(多个线程)中锁定此SyncRoot对象:

例:

lock (m_MySharedDictionary.SyncRoot)
{
    m_MySharedDictionary.Add(...);
}
Run Code Online (Sandbox Code Playgroud)

我能够使它工作,但这导致了一些丑陋的代码.我的问题是,是否有更好,更优雅的方式来实现线程安全的字典?

.net c# collections thread-safety

108
推荐指数
5
解决办法
7万
查看次数

用于双工回调的WSDualHttpBinding

使用WSDualHttpBinding进行双工回调是否适用于实际场景?说,我有一个使用随机端口的.NET应用程序,该服务是否能够解析客户端的基地址和端口以进行回调?

wcf duplex callback

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

更新用于将SQL Server中的表字段从NULL更新为非NULL的脚本

我在SQL Server数据库的表中有一个字段(比方说,foo),该表最初定义为可为空,但新要求表明此字段必须为非null.

在不删除表内容的情况下,通过更新脚本将此字段更新为非null的最佳方法是什么?我尝试从"设计"视图生成脚本,但在执行期间失败,因为表的当前内容具有foo的NULL值.更糟糕的是,如果我忽略了这个错误,它会继续删除表中的所有内容!

t-sql sql-server

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

FtpWebRequest/FtpWebResponse 上的 OPTS 命令

我正在使用 System.Net 命名空间中的 FtpWebRequest 和 FtpWebResponse 对象来发出 LIST 命令。我遇到的问题是我要连接的 FTP 服务器没有实现 OPTS 命令。

有没有办法阻止 FtpWebRequest 发出 OPTS 命令?

.net ftp system.net ftpwebrequest

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

SGML分析器.NET建议

在我的C#项目中,我已经处理了解析SGML文件的任务,并且非常天真地尝试使用XmlReader,这引起了一些有趣的启示(即SGML和格式正确的XML之间的区别,等等)。 )

因此,我认为我只需要一个不错的SGML解析器,即可将其转换为XML文件并从那里进行。在搜索中,我找到了两个可以与C#项目集成的SGML解析器:

还有其他建议吗?

.net c# sgml

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

从非托管 C++ 配置 .NET 库

我有一个名为 Foo 的 C# .NET 库,它生成一个 Foo.dll 文件。它也可以通过 .config 文件进行配置,如下所示:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="Foo.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Foo.Properties.Settings>
      <setting name="Server" serializeAs="String">
        <value>localhost</value>
      </setting>
    </Foo.Properties.Settings>
  </applicationSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我想要做的是从名为 Bar 的非托管 C++ 程序调用此 .NET 库中的函数,并能够从非托管 C++ 应用程序更改其配置。通过在 Foo 中将类/接口属性 ComVisible 设置为 true,我能够从 Bar 调用 Foo 函数。但是,我无法从非托管 C++ 应用程序更改 .config 文件值——服务器始终为 "localhost"

我正在尝试做什么——从非托管 C++ 配置 .NET 库——甚至可能吗?

c# c++ com configuration unmanaged

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