如何在C#中为save方法实现异步模式?

时间:2011-01-03 12:07:23

标签: c# compact-framework

我正在开发一个项目,我正在实现一个SaveSettings方法,该方法可以将大量设置保存到xml文件中。

问题是这需要时间,这就是为什么当我点击我的表单上的保存按钮时,我的UI只会暂停/停止一段时间。

方法如下所示

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时,我的UI应该顺利进行。我没有BackgroundWorker,因为我正在使用.Net Compact Framework。

有关实现异步模式的任何指导,请...

5 个答案:

答案 0 :(得分:1)

Save()的{​​{1}}可以实现为:

XDocument

答案 1 :(得分:0)

查看this帖子上接受的答案。如果需要,您还可以使用反射器并获取BackgroundWorker类的代码。 Here是它的一个实现,可以帮助您入门。

MSDN上还有一篇关于此问题的文章:Microsoft .NET Compact Framework Background Processing Techniques

答案 2 :(得分:0)

最简单的方法是使用.Net Thread

答案 3 :(得分:0)

如果您使用的是.Net 4(或更新版本),请考虑使用Tasks。它们是处理异步行为的一种更简单的方法。

答案 4 :(得分:0)

我试图整理一个简单的实现。这是未经测试的。而不是使用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);
    }
}