小编Faf*_*fnr的帖子

SqlConnection/SqlCommand线程安全吗?

我目前正在创建一个WCF Web服务.

作为其工作的一部分,遗憾的是需要进行一些相当密集的计算,但幸运的是,这些计算可以在对Web服务的调用之间共享.实际上 - 我们只需要进行一次计算,所有以后的调用都可以获得好处.

但是,由于WCF没有共享应用程序状态,因此在单实例模式下设置WCF似乎是合乎逻辑的.(每个客户端都需要进行一些计算,迫使我们重新计算它们,这可能是正常的,或者每次调用都是站不住脚的,这是不可能的)

但是,我不太熟悉保护多线程的代码.我一直在阅读它,因为我们的WCF代码都没有写入共享状态(除了计算位,这很容易保护)我几乎确信我不需要改变任何东西.

但是有一个障碍 - 我们使用SqlConnection和SqlCommand与我们的后端进行通信,我不确定我是否可以指望这些是线程安全的?

编辑:我或许应该澄清命令/连接始终是方法的本地.我们正在谈论一种模式:

using sqlConn = new SqlConnection(...) {
 try {
  sqlConn.Open()
} catch () {
  throw new FaultException();
}
var cmd = new SqlCommand("Some SQL", sqlConn);
var reader = cmd.ExecuteReader();
//Read the stuff 
reader.Close();
//Return something
}
Run Code Online (Sandbox Code Playgroud)

结束编辑

我在MSDN上查找了SqlCommand类:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx 其中说:"任何公共静态(在Visual Basic中共享)成员类型是线程安全的.任何实例成员都不保证是线程安全的."

我是否正确地解释了这一点,这意味着MS 不能保证SqlCommand在多线程场景中工作?

如果没有,是否有线程安全的替代方案?

是的,我可以在我的webservice中锁定所有数据库访问方法,但是a)它很丑陋b)如果没有必要我更喜欢我没有必要:)

提前干杯!

c# multithreading locking sqlcommand thread-safety

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

ListBoxDragDropTarget不会重新排序使用继承的元素

我有一个非常奇怪的问题,我不知道如何调试它.(旁注:我讨厌创建GUI!无论如何...... :)

我一直在遵循指南,在Silverlight上使用drag'n drop.现在,我感兴趣的是列表中的重新排序.

如果我完全按照网站上的例子,一切都很好.它按预期工作. 但是,当我尝试用其他东西替换元素时,我再也无法重新排序了?!

考虑以下XAML:

<toolkit:ListBoxDragDropTarget AllowDrop="True">
                <ListBox Width="200" Height="500" x:Name="FromBox" DisplayMemberPath="Label">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
            </toolkit:ListBoxDragDropTarget>
Run Code Online (Sandbox Code Playgroud)

除了DisplayMemberPath(此处为"Label")之外,这与我正在阅读的文章相同.

在代码隐藏中,我现在执行以下操作:

void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            FromBox.ItemsSource = GetElements();
        }

        public static ObservableCollection<Element> GetElements()
        {
            ObservableCollection<Element> Elements = new ObservableCollection<Element>();
            var Label = new Label();
            Label.Label = "Label me";
            Elements.Add(Label);

            var IntegerBox = new IntegerBox();
            IntegerBox.Label = "Størrelsen på en gennemsnits svale:";
            IntegerBox.Description = "cm";
            Elements.Add(IntegerBox);

            var TextBox = new TextBox();
            TextBox.Label = "QTTextBox";
            Elements.Add(TextBox); …
Run Code Online (Sandbox Code Playgroud)

silverlight silverlight-toolkit silverlight-4.0

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