10

オブジェクトを逆シリアル化するこのメソッドを Async/Await で文字列に変換しようとしています。

    public static T DeserializeObject<T>(string xml)
    {
        using (StringReader reader = new StringReader(xml))
        {
            using (XmlReader xmlReader = XmlReader.Create(reader))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                T theObject = (T)serializer.ReadObject(xmlReader);
                return theObject;
            }
        }
    }
4

4 に答える 4

17

ほとんどのシリアル化 API にはasync実装がありません。つまり、実際にできることは同期メソッドをラップすることだけです。例えば:

public static Task<T> DeserializeObjectAsync<T>(string xml)
{
    using (StringReader reader = new StringReader(xml))
    {
        using (XmlReader xmlReader = XmlReader.Create(reader))
        {
            DataContractSerializer serializer =
                new DataContractSerializer(typeof(T));
            T theObject = (T)serializer.ReadObject(xmlReader);
            return Task.FromResult(theObject);
        }
    }
}

これは実際には非同期ではありません。必要な API を満たしているだけです。オプションがある場合ValueTask<T>は、結果が同期/同期であることが多いシナリオで使用することをお勧めします

いずれにせよ、次のようなことができるはずです。

var obj = await DeserializeObject<YourType>(someXml);
Debug.WriteLine(obj.Name); // etc

実際の実装が同期か非同期かを知る必要はありません。

于 2012-08-09T13:41:31.180 に答える
2

少しサンプル、かなり原始的な方法:

    public delegate T Async<T>(string xml);

    public void Start<T>()
    {
        string xml = "<Person/>";
        Async<T> asyncDeserialization = DeserializeObject<T>;
        asyncDeserialization.BeginInvoke(xml, Callback<T>, asyncDeserialization);
    }

    private void Callback<T>(IAsyncResult ar)
    {
        Async<T> dlg = (Async<T>)ar.AsyncState;
        T item = dlg.EndInvoke(ar);
    }

    public T DeserializeObject<T>(string xml)
    {
        using (StringReader reader = new StringReader(xml))
        {
            using (XmlReader xmlReader = XmlReader.Create(reader))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                T theObject = (T)serializer.ReadObject(xmlReader);
                return theObject;
            }
        }
    }

デリゲートを定義し、それを使用して、コールバックを使用して呼び出しを開始/終了します。

C# の次のバージョンでは、async キーワードを使用してコードを非同期で実行できます。

于 2012-08-09T13:13:03.713 に答える