2016-06-16 3 views
-1

Я пытаюсь написать приложение, которое постоянно получает цену криптоконверсий. Функция CallAPI() получает цену от онлайн-API в формате JSON, анализирует ее и отправляет в текстовый блок в интерфейсе приложения. Он работает в цикле в то время как с коротким перерывом между:C# Универсальное приложение, не загружаемое

public MainPage() 
    { 
     this.InitializeComponent(); 

     KrakenConnector KC = new KrakenConnector(); 

     while (true) 
     { 
      CallAPI(KC, 0); 
      CallAPI(KC, 1); 
      CallAPI(KC, 2); 
      CallAPI(KC, 3); 
      CallAPI(KC, 4); 
      CallAPI(KC, 5); 
      Task.Delay(1000).Wait(); 
     } 
    } 

Я просто получаю экран всплывающий по умолчанию в Windows, Универсальные приложения, и это не будет в фактическое приложение. Как я могу это исправить? Почему он не входит в приложение? Должен ли я не устанавливать текстовый блок в функции CallAPI?

+1

Ну, так как метод 'MainPage' никогда не выходит, может быть, это причина, по которой он не стал дальше? Вероятно, вам стоит пересмотреть этот метод, чтобы он вызывался с помощью таймера. – DavidG

+0

Как бы я это сделал? Я пытаюсь просмотреть структуру .net в args, что класс таймера, но я не знаю, где найти проводник ... – MattyAB

ответ

0

Попробуйте

private bool isLoaded = true; 

public MainPage() 
{ 
    this.InitializeComponent(); 
    this.WorkItAsync(); 
    this.Unloaded += (s, e) => this.isLoaded = false; 
} 

private async Task WorkItAsync() 
{ 
    var KC = new KrakenConnector(); 

    while (this.isLoaded) 
    { 
     CallAPI(KC, 0); 
     CallAPI(KC, 1); 
     CallAPI(KC, 2); 
     CallAPI(KC, 3); 
     CallAPI(KC, 4); 
     CallAPI(KC, 5); 
     await Task.Delay(1000); 
    } 
} 
0

Ваш MainPage конструктор никогда не выходит. Кроме того, вы делаете звонки иTask.Delay в потоке пользовательского интерфейса, который не имеет значения. Вы должны сделать это в фоновом потоке.

Вот скелет лучшего подхода:

public sealed partial class MainPage 
{ 
    private bool running; 

    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     running = true; 

     // Start background thread 
     Task.Run(
      async() => 
      { 
       int counter = 0; 
       while (running) 
       { 
        // UI updates must happen on the UI thread; 
        // we use the Dispatcher for this: 
        await Dispatcher.RunAsync(
         CoreDispatcherPriority.Normal, 
         () => test.Text = counter.ToString()); 
        await Task.Delay(1000); 
        ++counter; 
       } 
      }); 
    } 

    protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     running = false; 
    } 

Соответствующий XAML:

<Page 
    x:Class="App2.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <StackPanel> 
     <TextBlock 
      x:Name="test" 
      FontSize="24" 
      HorizontalAlignment="Center" 
      Margin="0,24,0,0" /> 
     <!-- The button doesn't do anything; it's just to show that the UI is live --> 
     <Button 
      Content="Hello, world!" 
      HorizontalAlignment="Center" 
      Margin="0,24,0,0" /> 
    </StackPanel> 
</Page> 

Использование bool контролировать петлю немного простодушный, хотя; лучший подход заключается в использовании CancellationTokenSource, который также имеет возможность остановить Task.Delay мертвыми на своих дорожках. Вот еще один пример:

public sealed partial class MainPage 
{ 
    private CancellationTokenSource cancellationTokenSource; 

    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     cancellationTokenSource = new CancellationTokenSource(); 
     CancellationToken token = cancellationTokenSource.Token; 

     // Start background thread 
     Task.Run(
      async() => 
      { 
       int counter = 0; 
       while (true) 
       { 
        if (token.IsCancellationRequested) 
        { 
         // Stop the loop; we're moving away from the page 
         break; 
        } 

        // UI updates must happen on the UI thread; 
        // we use the Dispatcher for this: 
        await Dispatcher.RunAsync(
         CoreDispatcherPriority.Normal, 
         () => test.Text = counter.ToString()); 
        await Task.Delay(1000, token); 
        ++counter; 
       } 
      }); 
    } 

    protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     cancellationTokenSource?.Cancel(); 
    } 
} 
Смежные вопросы