[英]How can I implement asynchronous pattern for save method in C#?
我正在一個項目中,我正在實現一個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可以順利進行。 我沒有使用.Net Compact Framework的BackgroundWorker。
有關實現異步模式的任何指導,請...
XDocument
的Save()
可以實現為:
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
}
看看這篇文章的公認答案。 如果需要,您還可以使用反射器並獲取BackgroundWorker類的代碼。 這是一個入門的實現。
在MSDN上也有關於此的文章: Microsoft .NET Compact Framework背景處理技術
最簡單的方法是使用.Net線程
如果您使用的是.Net 4(或更高版本),請考慮使用Tasks 。 它們是處理正在旋轉的異步行為的更簡單方法。
我試圖將其簡化。 未經測試。 另外,也可以使用緊湊型框架中的ThreadPool
線程代替使用Thread
。 希望能幫助到你。
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.