2015-06-21 51 views
0

我想要做的是做一個後臺任務,記錄每個電話的解鎖,但我不能寫入日誌工作。回調中的異步方法

這是怎麼我註冊一個後臺任務:

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 /寫。 (有時它確實但不是每次都是)。

我認爲我不能只是做一個系統調用異步使用異步方法在那裏是有道理的。但後來我試圖將它運行到與ThreadPool.RunAsync異步lamdbda,也沒有成功。當你想在不是異步的函數中調用異步方法時,你通常會做什麼?

+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(); 
}