Производительность управления поворотом WP7 для меня не гладкая - PullRequest
0 голосов
/ 27 октября 2011

ОК, мои приложения работают, я просто НЕНАВИЖУ производительность, которую я вижу при переключении элементов сводки.Я случайно получаю заикания и зависания.Я действительно отстой в многопоточности, так как пришел из веб-разработки.Есть ли что-то, что я мог бы сделать по-другому, чтобы ускорить свои приложения?

Вот главная страница, переходящая от моего "Твиста!"приложение.Наибольшие изменения происходят при переключении между пунктами «Список наблюдения» и «Мои списки».

    private void panTwist_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        switch (panTwist.SelectedIndex)
        {
            case 0:     //Watch List
                App.vmTweet.LoadMore = false;
                DataContext = App.vmTweet;


                if (!App.vmTweet.IsWatchListTweetsLoaded)
                {
                    LoadWatchList(false);    
                }
                break;
            case 1:         //menu
                ApplicationBar = null;
                SetMenuDisplay();
                break;
            case 2:         //My Lists

                ApplicationBar = null;
                DataContext = App.vmTwitterList;
                if (!App.vmTwitterList.IsMyListsLoaded)
                {
                    GetMyLists();
                }
                MyListsSetDisplay();
                break;
            default:

                break;
        }

    }

Вот код из моего приложения «Wiki-Reef».Этот работает еще хуже ....

    private void panCorals_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        switch (panCorals.SelectedIndex)
        {
            case 0:     //search corals

                break;
            case 1:         //top corals
                if (!App.vmCoral.IsTopDataLoaded)
                {
                    App.vmCoral.IsTopLoading = true;
                    if (App.HasConnectivity)
                    {
                        //get corals from web
                        App.vmCoral.GetTopCorals();

                    }
                    else
                    {
                        //get saved corals from device
                        MessageBox.Show("Your phone does not have a connection to the internet, so the results you see could be empty or outdated.");
                        App.vmCoral.GetSavedTopCorals();
                    }
                }
                break;
            case 2:         //new corals

                if (!App.vmCoral.IsNewDataLoaded)
                {
                    App.vmCoral.IsNewLoading = true;
                    if (App.HasConnectivity)
                    {
                        //get corals from web
                        App.vmCoral.GetNewCorals();

                    }
                    else
                    {
                        //get saved corals from device
                        MessageBox.Show("Your phone does not have a connection to the internet, so the results you see could be empty or outdated.");
                        App.vmCoral.GetSavedNewCorals();
                    }
                }

                break;
            default:

                break;
        }

    }

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Не сбрасывать DataContext.

Попробуйте использовать этот код. Это следует MVVM (см. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) и не сбрасывает DataContext.

Посмотреть модель:

public class MainPageViewModel
{
    public MainPageViewModel()
    {
        ItemsOfPivotOne = new ObservableCollection<ItemOfPivotOne>();
        ItemsOfPivotTwo = new ObservableCollection<ItemOfPivotOne>();
    }

    public void LoadPivotOne()
    {
        // add your http logic here and add elements like this: 
        ItemsOfPivotOne.Add(item);
    }

    public void LoadPivotOne()
    {
        // add your http logic here and add elements like this: 
        ItemsOfPivotTwo.Add(item);
    }

    public ObservableCollection<ItemOfPivotOne> ItemsOfPivotOne {get; set;}
    public ObservableCollection<ItemOfPivotTwo> ItemsOfPivotTwo {get; set;}
}

Код страницы позади:

public class MainPage
{
    public MainPageViewModel Model { get { return (MainPageViewModel)Resources["viewModel"]; } }

    private void PivotSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        switch (panTwist.SelectedIndex)
        {
            case 0:
                Model.LoadPivotOne();
                break;
            case 1: 
                Model.LoadPivotTwo();
                break;
        }
    }
}

XAML-код с реализацией модели представления по ресурсу:

<phone:PhoneApplicationPage x:Class="MyNamespace.MainPage" ... >
    <phone:PhoneApplicationPage.Resources>
        <viewModels:MainPageViewModel x:Key="viewModel" />
    </phone:PhoneApplicationPage.Resources>

    <Grid x:Name="LayoutRoot" DataContext="{StaticResource viewModel}">
        <controls:Pivot Title="MY APPLICATION">
            <controls:PivotItem Header="Pivot 1">
                <ListBox ItemsSource="{Binding ItemsOfPivotOne}" />
            </controls:PivotItem>
            <controls:PivotItem Header="Pivot 2">
                <ListBox ItemsSource="{Binding ItemsOfPivotTwo}" />
            </controls:PivotItem>
        ...

Надеюсь, это поможет ... если не спросите меня здесь ...

1 голос
/ 28 октября 2011

Я согласен с Рико в этом.Это похоже на ваши удаленные звонки (звонки на веб-сервисы).Если это так, убедитесь, что вы используете HttpWebRequest вместо WebClient.Когда вы используете WebClient, он блокирует поток пользовательского интерфейса.Непосредственно из MSDN относительно использования WebClient:

"пользовательский интерфейс будет не отвечать до завершения обработки, что приведет к ухудшению работы пользователя, особенно если набор обрабатываемых данных большой."

Вот ссылка .Я рекомендую прочитать все этого документа, так как он содержит другие советы по повышению производительности ваших приложений, включенные на этой странице.

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