簡體   English   中英

如何在C#中為save方法實現異步模式?

[英]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。

有關實現異步模式的任何指導,請...

XDocumentSave()可以實現為:


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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM