我正在开发一个项目,我正在实现一个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。
有关实现异步模式的任何指导,请...
答案 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);
}
}