Запрос SQL 2 LINQ (вызванный привязкой данных) полностью замораживает приложение WPF - PullRequest
0 голосов
/ 05 ноября 2008

Раньше сегодня я выслеживал очень странную ошибку ... Я наконец-то отследил ее вплоть до того, что кажется причиной проблемы.

С оригинальным отчетом можно ознакомиться здесь: Оригинальный вопрос

Детали изменились настолько, чтобы оправдать новый вопрос.

Может показаться, что мое приложение иногда, НЕ ВСЕ ВРЕМЯ, зависает когда он достигает следующего запроса 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. Элементы этого класса привязаны к 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:

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);

Таким образом, этот код вызывается, когда происходит привязка данных, должен был понять, что раньше. Тем не менее я понятия не имею, почему это иногда вызывает проблемы ...

UPDATE

В обоих случаях (когда приложение зависает, а когда нет) состояние соединения «Закрыто» непосредственно перед кодом запроса, как я вижу из:

db.Connection.State.ToString()

ОБНОВЛЕНИЕ 2 Я забыл упомянуть, что переместил этот код из геттера, так что это только один раз. Должно быть спал во время реализации это первый раз. Код теперь работает нормально, хотя на XP ... каждый сейчас и затем, но гораздо реже проблема все еще возникает.

* ОБНОВЛЕНИЕ 3 * Просто чтобы быть ясно, я использую базу данных SQL Compact с очень небольшим количеством данных

Ответы [ 2 ]

2 голосов
/ 06 ноября 2008

Наличие свойства, открывающего соединение с базой данных и выполняющего запрос, не является хорошим шаблоном.

Лучшим подходом было бы запросить набор объектов из LINQ to SQL и связать их с элементом управления WPF.

1 голос
/ 06 ноября 2008

Я согласен с Дэмиеном, почему вы не выполняете вызов БД асинхронно? Таким образом, пользовательский интерфейс остается отзывчивым, и вы можете корректно обрабатывать ошибки БД в фоновом режиме, не зная пользователя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...