2011-01-03 3 views
0

Ich arbeite an einem Projekt, in dem ich eine SaveSettings-Methode implementiere, die viele Einstellungen in einer XML-Datei speichert.Wie kann ich asynchrones Muster für die Speichermethode in C# implementieren?

Problem ist, dass es Zeit braucht, das zu tun, deshalb, wenn ich auf die Schaltfläche Speichern auf meinem Formular klicke, bleibt meine UI einfach eine Weile stehen.

Das Verfahren sieht aus wie unten

public void SaveSettings(SettingsType settingsType) 
     { 
      if (!File.Exists(_settingsFile)) 
      { 
       File.Create(_settingsFile); 
      } 

      var xmlDoc = XDocument.Load(_settingsFile); 

      switch (settingsType) 
      { 
       case SettingsType.Measurement: 
        SaveMeasurementSettings(ref xmlDoc); 
        break; 
       case SettingsType.Display: 
        SaveDisplaySettings(ref xmlDoc); 
        break; 
       case SettingsType.Common: 
        SaveCommonSettings(ref xmlDoc); 
        break; 
       case SettingsType.View: 
        SaveViewSettings(ref xmlDoc); 
        break; 
       case SettingsType.InputChannel: 
        SaveInputChannelSettings(ref xmlDoc); 
        break; 
       default: 
        break; 
      } 
      xmlDoc.Save(_settingsFile); 
    } 

Ich möchte Savesettings-Methode asynchron etwas BeginSave/EndSave so, dass, wenn ich rufe BeginSave meine UI machen sollte glatt gehen. Ich habe keinen BackgroundWorker, da ich .Net Compact Framework verwende. bitte ...

Antwort

1

Die Save() von XDocument kann realisiert werden:


public void Save(string xmlFilePath) 
{ 
    Thread thread = new Thread(new ParameterizedThreadStart(SaveSettings)); 
    thread.Start(xmlFilePath); 
} 

private void SaveSettings(object data) 
{ 
    string xmlFilePath; 
    if ((xmlFilePath = data as string) != null) 
    { 
     this.SaveSettingsFile(xmlFilePath); 
    } 
} 

private void SaveSettingsFile(string xmlFilePath) 
{ 
    // Save the file contents 
} 
0

Wenn Sie sind .Net 4 (oder neuer), verwenden Sie . Sie sind eine einfachere Möglichkeit, mit asynchronem Verhalten, das Sie gerade ausführen, umzugehen.

+0

Nicht sicher Aufgaben sind in der CF – SwDevMan81

0

Ich habe versucht, eine einfache Implementierung zusammenzustellen. Es ist nicht getestet. Suchen Sie auch statt Thread, ob Sie einen ThreadPool Thread im kompakten Framework verwenden können. Ich hoffe es hilft.

public class SettingsType {} 

public class Settings 
{ 
    private Thread _worker; 

    public void SaveSettings(SettingsType type) 
    { 
     // save logic 
    } 

    public void BeginSaveSettings(SettingsType type) 
    { 
     _worker = new Thread(() => SaveSettings(type)) {IsBackground = true}; 
     _worker.Start(); 
    } 

    public bool EndSaveSettings(TimeSpan timeOut) 
    { 
     return _worker.Join(timeOut); 
    } 
} 
Verwandte Themen