SQL 2 LINQ查询(由数据绑定调用)完全冻结WPF应用程序

时间:2008-11-04 21:55:34

标签: c# wpf linq linq-to-sql data-binding

今天早些时候,我正在寻找一个非常奇怪的错误...我终于找到了它 到了导致问题的原因。

原始报告可在此处找到:original question

细节已经改变,足以保证一个新问题。

看起来我的应用程序有时候,并非所有时间都会冻结 当它到达以下LINQ查询时:

using (NetworkDatabaseContext db = new 

NetworkDatabaseContext(UISession.ConnectionString))
{
   Ballast ballast = db.Ballasts.FirstOrDefault(b => b.NetworkId == UISession.NetworkId &&
          b.ShortAddress == this.innerBallast.ShortAddress && b.ControllerSerial == this.controllerSerial);

这就是它的样子:

Not Responding

大部分时间这种方法都很好......但是时不时会锁定。 此代码是BallastListItem类的一部分。此类的项绑定到Page:

上的ListBox
<ListView Name="lstBallasts" Margin="5" DockPanel.Dock="Top" MinHeight="100"><!-- The MinHeight is used to get a good view in the designer -->
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Address" DisplayMemberBinding="{Binding InnerBallast.ShortAddress}" Width="70"/>
                <GridViewColumn Header="Name" Width="300">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Name="txtBallastDisplayName" Text="{Binding DisplayName}" Width="270" MaxWidth="270" MaxLength="100"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Type" DisplayMemberBinding="{Binding DeviceType}" Width="150"/>
                <GridViewColumn Header="Status" DisplayMemberBinding="{Binding InnerBallast.StandardVersion}" Width="150"/>
            </GridView>
        </ListView.View>
    </ListView> 

代码是DisplayName属性getter的一部分:

public string DisplayName
    {
        get
        {
            using (NetworkDatabaseContext db = new NetworkDatabaseContext(UISession.ConnectionString))
            {
                Ballast ballast = db.Ballasts.FirstOrDefault(b => b.NetworkId == UISession.NetworkId && 
                   b.ShortAddress == this.innerBallast.ShortAddress && b.ControllerSerial == this.controllerSerial);

所以这个代码在数据绑定发生时被调用,之前应该已经意识到了。 我仍然不知道为什么这有时会导致问题...

更新

在这两种情况下(当应用程序冻结时,它不会冻结) 在查询代码之前,连接状态是“已关闭”,正如我从以下所示:

db.Connection.State.ToString()

更新2 我忘了提到我把那个代码移出了吸气剂, 所以它只获取一次。实施时一定是在睡觉 这是第一次。代码工作正常,虽然在XP上...现在每一次 然后,但问题仍然少发生。

*更新3 * 为了清楚起见,我使用的SQL Compact数据库只有非常少的数据

2 个答案:

答案 0 :(得分:2)

让属性打开数据库连接并运行查询不是一个好的模式。

更好的方法是从LINQ查询一组对象,然后将它们绑定到WPF控件。

答案 1 :(得分:1)

我同意Damien,为什么不异步执行数据库调用?这样UI就能保持响应,您可以在后台优雅地处理数据库错误,而无需用户知道...