C# 异步操作

using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO;

//Request 类用于通过
//异步调用传递数据
public class RequestState
{
    const int BUFFER_SIZE = 1024;
    public StringBuilder RequestData;
    public byte[] BufferRead;
    public HttpWebRequest Request;
    public Stream ResponseStream;
    //创建适当编码类型的解码器
    public Decoder StreamDecode = Encoding.UTF8.GetDecoder();

	public RequestState()
	{
        BufferRead=new byte[BUFFER_SIZE];
        RequestData = new StringBuilder("");
        Request = null;
        ResponseStream = null;
	}
}

//ClientGetAsync发出异步请求
class ClientGetAsync
{
    public static ManualResetEvent allDone=new ManualResetEvent(false);
    const int BUFFER_SIZE = 1024;
    public static void Main(string[] args)
    {
        if (args.Length < 1)
        {
            showusage();
            return;
        }

        //从命令行获取URI
        Uri HttpSite = new Uri(args[0]);
        //创建请求对象
        HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(HttpSite);
        //创建状态对象
        RequestState rs = new RequestState();
        //将请求添加到状态,以便它可以被来回传递
        rs.Request = wreq;
        //发出异步请求
        IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(new AsyncCallback(RespCallback),rs);

        //将ManualResetEvent 设置为Wait
        //以便在调用回调前,应用程序不退出
        allDone.WaitOne();
    }

    public static void showusage()
    {
        Console.WriteLine("尝试获取(GET)一个URL");
        Console.WriteLine("\r\n用法::");
        Console.WriteLine("ClientGetAsync URL");
        Console.WriteLine("示例::");
        Console.WriteLine("ClientGetAsync http://www.microsoft.con/net/");
    }

    private static void RespCallback(IAsyncResult ar)
    {
        //从异步结果获取RequestState对象
        RequestState rs = (RequestState)ar.AsyncState;
        //从RequestState获取HttpWebRequest
        HttpWebRequest req = rs.Request;
        //调用EndGetResponse生成HttpWebResponse对象
        //该对象来自上面发出的请求
        HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(ar);

        //既然我们拥有了响应,就该从
        //响应流开始读取数据了
        Stream ResponseStream = resp.GetResponseStream();

        //该读取操作也使用异步完成,所以,
        //我们将以RequestState存储流
        rs.ResponseStream = ResponseStream;


        //rs.BufferRead 被传入到BeginRead.
        //这是数据将被读入的位置
        IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead,0,BUFFER_SIZE,new AsyncCallback(ReadCallBack),rs);
    }

    private static void ReadCallBack(IAsyncResult asyncResult)
    {
        //从asyncresult获取RequestState对象
        RequestState rs = (RequestState)asyncResult.AsyncState;

        //取出在RespCallback中设置的ResponseStream
        Stream responseStream = rs.ResponseStream;

        //此时,rs.BufferRead中应该有一些数据
        //读取操作将告诉我们那里是否有数据
        int read = responseStream.EndRead(asyncResult);

        if (read > 0)
        {
            //准备Char 数组缓冲区,用于向Unicode转换
            Char[] charBuffer = new Char[BUFFER_SIZE];

            //将字节流转换为Char 数组,然后转换为字符串
            //len显示多少字符被转换为Unicode
            int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);
            String str = new String(charBuffer, 0, len);

            rs.RequestData.Append(str);

            IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
        }
        else
        {
            if (rs.RequestData.Length > 1)
            {
                // 所有数据都已被读取,因此将其显示到控制台
                string strContent;
                strContent = rs.RequestData.ToString();
                Console.WriteLine(strContent);
            }

            //关闭响应流
            responseStream.Close();

            allDone.Set();

        }
        return;
    }
}

2. 判断控件的Handle是在当前线程中,则无需异步执行,否则要异步

if (this.gcDC.InvokeRequired)
            {
                OnRegionChangedDelegate dlgt = new OnRegionChangedDelegate(OnLevelRegionChanged);
                this.Invoke(dlgt, new object[] { sender, ev });
            }

3. 开启新线程

可以通过开启新线程来执行异步操作,并给异步操作方法传递参数。参数通常包括异步方法所需的所有数据。

Thread thread=new Thread(new ParameterizedThreadStart(GetDataFromWebService));
private static void GetDataFromWebService(object entity){
        showWindow();
        getData();
        window.clost();
}

4.多线程读写变量

http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

 5.ConcurrentHashMap

http://www.iteye.com/topic/344876

6.在界面线程外打开程序

resultsCollection.AddRange(entity.DataCol);
                InsertIntoTable(resultsCollection, "", entity.tableName, entity.Schema, "", entity.IsNewFetch);
                if (window != null)
                {
                    #region[Close progess window]
                    System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        (window.WpfUIElement as System.Windows.Window).Close();
                        entity.SetNexValue();
                    }));
                    #endregion
                }

还有AutomationPattern.Invoke()方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值