我目前正在创建一个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)如果没有必要我更喜欢我没有必要:)
提前干杯!
我有一个非常奇怪的问题,我不知道如何调试它.(旁注:我讨厌创建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)