2

非同期/待機機能を使用してXElementオブジェクトからxmlファイルを書き込もうとしました。しかし、XElement.Save()がasync/awaitで動作しないことに気づきました。

おそらく解決策は、FileStreamオブジェクトでXElement.Save(Stream)を使用することです...

だから、私は以下のようにいくつかのコードを書きますが、ファイルストリームのもので扱うのは難しいです。

public async Task SaveAsync(XElement xml, string filename)
{
    using (var fs = new FileStream(filename, FileMode.Create))
    {
        xml.Save(fs);
        await fs.WriteAsync(**please_help_me**);
    }
}

このアプローチをどのように行うか、または他の解決策はありますか?

4

3 に答える 3

6

本当に IO でブロックしたくない (そして ThreadPool スレッド/自分のスレッドをハングさせたくない) 場合は、おそらく一時的な MemoryStream を使用する必要があります。

using(var ms = new MemoryStream())
using(var fs = new FileStream("myFile", FileMode.Create))
{
    xml.Save(ms);
    ms.Position = 0;
    await ms.CopyToAsync(fs)
}
于 2012-09-18T17:20:29.507 に答える
2

XElementには非同期で自分自身を書き込むメソッドがないため、それを使用して行う呼び出しはすべて同期されます。このメソッドを非同期にする必要がある場合(たとえば、これはUIスレッドで発生し、XMLの保存中にアプリケーションが「フリーズ」したように見えないように、バックグラウンドスレッドで実行したい場合)、新しいタスクを開始し、それをバックグラウンドで保存したい場合があります。

public async Task SaveAsync(XElement xml, string filename)
{
    await Task.Factory.StartNew(delegate
    {
        using (var fs = new FileStream("myFile", FileMode.Create))
        {
            xml.Save(fs);
        }
    });
}
于 2012-09-18T16:50:05.040 に答える