Как я могу реализовать асинхронный шаблон для метода сохранения в C #? - PullRequest
0 голосов
/ 03 января 2011

Я работаю над проектом, в котором реализую метод SaveSettings, который сохраняет множество настроек в XML-файле.

Проблема в том, что для этого требуется время, поэтому, когда я нажимаю кнопку Сохранить в моей форме, мой пользовательский интерфейс просто зависает / останавливается на некоторое время.

Метод выглядит следующим образом

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

Я хочу сделать метод SaveSettings асинхронным чем-то BeginSave / EndSave, чтобы при вызове BeginSave мой интерфейс работал гладко. У меня нет BackgroundWorker, так как я использую .Net Compact Framework.

Любые рекомендации по реализации асинхронного шаблона, пожалуйста ...

Ответы [ 5 ]

1 голос
/ 03 января 2011

Save() из XDocument может быть реализовано как:


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 голосов
/ 03 января 2011

Я попытался собрать упрощенную реализацию. Это не проверено. Также вместо использования Thread посмотрите, можете ли вы использовать поток ThreadPool в компактной структуре. Надеюсь, это поможет.

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);
    }
}
0 голосов
/ 03 января 2011

Если вы используете .Net 4 (или новее), рассмотрите возможность использования Tasks . Это более простой способ справиться с асинхронным поведением, которое вы раскручиваете.

0 голосов
/ 03 января 2011

Самый простой способ - использовать .Net Thread

0 голосов
/ 03 января 2011

Посмотрите принятый ответ на этом посте.Вы также можете использовать рефлектор и получить код для класса BackgroundWorker, если хотите. Здесь - это реализация, с которой можно начать.

Существует также статья на MSDN об этом: Методы обработки фона Microsoft .NET Compact Framework

...