1

プロジェクトの非同期ラッパーを作成して、コードを整理し、サーバーとやり取りするオブジェクトに対して同じコードを何度も記述しないようにしようとしています。

私は protobuf を使用する予定ですが、このスレッドのために、オブジェクトを文字列に変更しました。

私のマンボジャンボコード:

    public class AsyncWrapper
    {
        public void Run(Uri url, string requestString, string responseString, WebHeaderCollection headerCollection)
        {
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.Headers = headerCollection;
            request.BeginGetRequestStream((s) => 
            {
                var req = (HttpWebRequest)s.AsyncState;
                var str = req.EndGetRequestStream(s);

                System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding();
                Byte[] bytes = encoding.GetBytes(responseString);

                str.Write(bytes, 0, bytes.Length);
                str.Close();

                req.BeginGetResponse((k) => 
                {
                    var req2 = (HttpWebRequest)k.AsyncState;
                    var resp = (HttpWebResponse)req2.EndGetResponse(k);

                    byte[] bytes2 = ReadFully(resp.GetResponseStream());

                    string res = System.Text.Encoding.Unicode.GetString(bytes2);

                }, req);

            }, null);
        }

        private static byte[] ReadFully(Stream input)
        {
            byte[] buffer = new byte[1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }
    }

私がやろうとしているのは、サーバーとの "2 段階" 通信方法の手順全体をラップする 1 つの関数を作成することです。最初に最初の要求、次に応答です。

私は正しい道を進んでいますか?重要な部分が欠けています。イベント処理。計画では、でイベントを発生string res = System...させて、ジョブが完了したことをアプリケーションに知らせることでした。

4

1 に答える 1

1

私の理解が正しければ、長い同期操作を非同期操作に切り替えたいと考えています。スレッドでそれを行うことができます:

public class AsyncWrapper
{
    public event Action<string> RunCompleted;

    public void Run(Uri url, string requestString, string responseString, WebHeaderCollection headerCollection)
    {
        Thread thread = new Thread(new ParameterizedThreadStart(RunThread));

        thread.start(new [] { url, requestString, responseString, headerCollection });
    }

    public void RunThread(object Obj)
    {
        object[] ObjArray = (object[])Obj;

        Uri url = (Uri)ObjArray[0];
        string requestString = (string)ObjArray[1];
        string responseString = (string)ObjArray[2];
        WebHeaderCollection headerCollection = (WebHeaderCollection)ObjArray[3];

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.Headers = headerCollection;
        request.BeginGetRequestStream((s) => 
        {
            var req = (HttpWebRequest)s.AsyncState;
            var str = req.EndGetRequestStream(s);

            System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding();
            Byte[] bytes = encoding.GetBytes(responseString);

            str.Write(bytes, 0, bytes.Length);
            str.Close();

            req.BeginGetResponse((k) => 
            {
                var req2 = (HttpWebRequest)k.AsyncState;
                var resp = (HttpWebResponse)req2.EndGetResponse(k);

                byte[] bytes2 = ReadFully(resp.GetResponseStream());

                string res = System.Text.Encoding.Unicode.GetString(bytes2);

            }, req);

        }, null);

        if (RunComleted != null)
        {
            RunCompleted(res);
        }
    }

    private static byte[] ReadFully(Stream input)
    {
        byte[] buffer = new byte[1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }
}
于 2012-12-13T13:04:56.077 に答える