2015-06-21 3 views
0

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

Это то, как я зарегистрировав фона Задача:

public App() 
    { 
     this.InitializeComponent(); 
     this.Suspending += this.OnSuspending; 

     backgroundTask = registerBackgroundTask(); 
    } 

    private BackgroundTaskRegistration registerBackgroundTask() 
    { 
     // ----------------------------- 
     const string taskName = "BackgroundTask_Task"; 
     // ----------------------------- 


     IAsyncOperation<BackgroundAccessStatus> accessStatus = BackgroundExecutionManager.RequestAccessAsync(); 

     SystemTrigger systemTrigger = new SystemTrigger(SystemTriggerType.UserPresent, false); 

     foreach(var cur in BackgroundTaskRegistration.AllTasks) 
     { 
      if(cur.Value.Name == taskName) 
      { 
       // The Task is already registered. 
       return (BackgroundTaskRegistration)(cur.Value); 
      } 
     } 

     BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); 

     builder.Name = taskName; 
     builder.TaskEntryPoint = typeof(BackgroundTask_Task.Task).FullName; 
     builder.SetTrigger(systemTrigger); 

     return builder.Register(); 

    } 

И тогда им пытаются это:

public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     Debug.WriteLine("Test"); 
     Debug.WriteLine(DateTime.Now.ToString("g")); 

     StorageFolder dataFolder = ApplicationData.Current.LocalFolder; 
     StorageFile logFile = await dataFolder.CreateFileAsync("logFile.txt", CreationCollisionOption.OpenIfExists); 

     IList<string> logLines = await FileIO.ReadLinesAsync(logFile); 

     foreach(var s in logLines) 
     { 
      Debug.WriteLine(s); 
     } 

     logLines.Add(DateTime.Now.ToString("g")); 
     if(logLines.Count > 5) 
     { 
      logLines.RemoveAt(0); 
     } 

     await FileIO.AppendLinesAsync(logFile, logLines); 

    } 

Но проблема в том, что не будет читать/писать из LogFile.txt , (Иногда это делалось, но не каждый раз).

Я думал, что я не могу просто сделать асинхронный вызов, чтобы использовать асинхронные методы там, что имело бы смысл. Но затем я попытался запустить его в async lamdbda с ThreadPool.RunAsync, и не получилось. Что вы обычно делаете, когда хотите вызывать асинхронные методы в функциях, которые не являются асинхронными?

+1

это может помочь http://www.poppastring.com/blog/MakingAsynchronousCallsFromBackgroundTasks.aspx –

+0

Что забыл: он иногда работает .. особенно при использовании WriteTextAsync, чтобы просто написать одну строку, он работает безупречно .. но не тогда, когда я пытаюсь написать/прочитать несколько строк .. – MS669

+0

@NedStoyanov Вот оно! Спасибо огромное! Так легко, и я пытался часами ... – MS669

ответ

1

Как уже упоминалось в этой blog entr у, асинхронная работа должна быть воплощен в качестве фона задачи отсрочки

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 

    Debug.WriteLine("Test"); 
     Debug.WriteLine(DateTime.Now.ToString("g")); 

     StorageFolder dataFolder = ApplicationData.Current.LocalFolder; 
     StorageFile logFile = await dataFolder.CreateFileAsync("logFile.txt", CreationCollisionOption.OpenIfExists); 

     IList<string> logLines = await FileIO.ReadLinesAsync(logFile); 

     foreach(var s in logLines) 
     { 
      Debug.WriteLine(s); 
     } 

     logLines.Add(DateTime.Now.ToString("g")); 
     if(logLines.Count > 5) 
     { 
      logLines.RemoveAt(0); 
     } 

     await FileIO.AppendLinesAsync(logFile, logLines); 

    _deferral.Complete(); 
} 
Смежные вопросы