关于 IAsyncResult 的同步问题

问题描述

定入了delegate如下delegateboolInsertDataAsync(stringsSQL));privateboolInsertData(stringsSQL){//insertdatabysqlstring}privatevoidEndInsertData(IAsyncResultiar){InsertDataAsyncpasser=(InsertDataAsync)iar.AsyncState;boolbResult=passer.EndInvoke(iar);}调用如下Main{stringsSQL="insertintoAvalues('aaa",DateTime.Now.ToString("yyyy-MM-ddHH:mm:ssfff"));while(true){InsertDataAsyncinsert=newInsertDataAsync(InsertData);IAsyncResultiar=parser.BeginInvoke(sSQL,newAsyncCallback(EndInsertData),insert);} 上面方式在Main代码段中插入数据到数据库不能做到接while(true)循环的次序插入数据,请问如何做到按while(true)循环插入数据?当然上面代码只是为了例出情景,用ManualResetEventclass是否可以,其他方法呢?

解决方案

解决方案二:
异步没法保证执行顺序因为你要保证插入顺序,所以没法多个插入同时执行。直接在后台线程里面执行while循环就不就好了吗
解决方案三:
要按顺序来干嘛要异步调用?
解决方案四:
定入了delegate如下delegateboolInsertDataAsync(stringsSQL));privateboolInsertData(stringsSQL){//insertdatabysqlstring}privatevoidEndInsertData(IAsyncResultiar){InsertDataAsyncpasser=(InsertDataAsync)iar.AsyncState;boolbResult=passer.EndInvoke(iar);}调用如下Main{stringsSQL="";inti=0;while(true){i++;sSQL="insertintoAvalue(i,DateTime.Now.ToString("yyyy-MM-ddHH:mm:ssfff"));InsertDataAsyncinsert=newInsertDataAsync(InsertData);IAsyncResultiar=parser.BeginInvoke(sSQL,newAsyncCallback(EndInsertData),insert);} 上面方式在Main代码段中插入数据到数据库,但不能做到百分百按while(true)循环的i和插入时间递增次序来插入数据,请问如何做到按while(true)循环插入数据?当然上面代码只是为了例出情景,用ManualResetEventclass是否可以,其他方法呢?
解决方案五:
引用1楼songbing774933的回复:

异步没法保证执行顺序因为你要保证插入顺序,所以没法多个插入同时执行。直接在后台线程里面执行while循环就不就好了吗

实际情况是这样,client不断发有包头的xml字节包过来,server收到以后,拆出xml然后解析插入到数据库中我的做法是,把收到的每个包放到Queue<T>中,然后引发Queue的CollectionChanged事件,并在事件中通过字符串操作,得到xml格式字符串,然后用 IAsyncResult 方式操作XML并插入数据库中,可是收到xml包的次序和插入数据库次序不一致,有时收到xml早的反而插入晚,

时间: 2024-09-15 07:13:08

关于 IAsyncResult 的同步问题的相关文章

.NET关于同步、异步及Socket

异步 以SOCKET通信中的异步方法为例: public static ManualResetEvent ConnectDone = new ManualResetEvent(false);     public static void ConnectCallback(IAsyncResult ar)     {         Socket sClient = (Socket)ar.AsyncState;         sClient.EndConnect(ar);         Cons

C#.net同步异步SOCKET通讯和多线程总结

多线程|异步 同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip和监听的端口与socket进行绑定,开始监听连接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端进行通信. 客户端建立一个socket,设置好服务器端的IP和提供服务的端口,发出连接请求,接收到服务的确认后,尽力连接,开始与服务器进行通信. 服务器端和客户端的连接及它们之间的数据传送均采

改进同步等待的网络服务端应用

思路:ThreadPool的静态方法RegisterWaitForSingleObject是专门解决这个问题的,它可以等待一个 等待句柄,在这个等待句柄收到信号后执行一个回调方法,从而解决了利用一个单独的线程去等待信号的 问题,减少了空闲的线程.为了演示这个场景,我们用HttpListener类来创建一个网络服务端,收到客户 端的请求后要异步调用一个方法去处理请求,在这个请求处理完或者超时之前,不会给客户端返回 Response的,客户端的请求一直在这儿等着 .ThreadPool.Regist

什么是.Net的异步机制(APM核心IAsyncResult)

异步的核心: IAsyncResult Asynchronous Programming Model 整个异步调用过程中都是围绕IAsyncResult来进行的,大家可以看看上篇文章的例子,BeginXXX 返回这个对象,EndXXX接收这个对象来结束当前异步对象,下面我们来看看IAsyncResult 接口成员/和实现此接口的AsyncResult类成员(其中有些在上篇中已经涉及到) IAsyncResult接口 1public interface IAsyncResult 2 { 3 Wai

UDP 接收数据同步 异步选择问题

问题描述 同步加线程使用事件并发处理接收到的数据publicvoidSyncRecive(){Tasklisten=newTask(()=>{while(true){intlength=connect.ReceiveFrom(this.packetBuffer,0,this.packetBuffer.Length,SocketFlags.None,refthis.remoteEndPoint);byte[]packet=this.packetBuffer.Unpack(length);if(le

同步,异步,多线程,你怎么看?

原文:同步,异步,多线程,你怎么看?[原创] 讲解同步与异步的帖子多如牛毛,个人的理解,简单地说同步就是串行,异步就是并行.同步的情况下,A调用B,A等B执行完成后接着执行,自始至终只有一个线程在运行:而异步时,A调用B,B执行,A也继续执行,这个过程中有两个线程在运行.本文通过winform下的一个实例讲解同步与异步的差别,本文的例子很简单,适合初学者. 1.同步 大家应该经常碰到这种情况,点击界面上某个按钮或者某个控件后界面卡死的情况,个人觉得其中一个原因可能是主线程的问题,界面主线程在后台

多线程,异步委托,同步委托几种方式的区别

Code        public delegate void DoThingsDelegate();        private void Window_Loaded(object sender, RoutedEventArgs e)        {            //通过子线程调用方法  按钮事件可以执行            Thread a = new Thread(new ThreadStart(DoSomeThing));            a.IsBackgrou

艾伟_转载:C# 委托的同步调用和异步调用

委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System;using System.Threading;public delegate int AddHandler(int a, int b);public class Foo {static void Main() { Console.WriteLine("**********SyncInvokeTest**************&

如何:创建同步/异步 HTTP 处理程序

  来源:MSDN 一.如何:创建同步 HTTP 处理程序 本主题阐释一个 HTTP 处理程序的代码,该处理程序对 ASP.NET 应用程序中其 URL 以 .sample 结尾的资源执行同步请求处理.此代码示例阐释了下列内容: ·                 一个 HTTP 处理程序类的代码.该类必须实现 ProcessRequest 方法和 IsReusable 属性. ·                 Web.config 文件中注册该处理程序并将 .sample 文件扩展名映射到该