C#高级编程-事务和网络

来源:互联网 发布:美国情景喜剧排行知乎 编辑:程序博客网 时间:2024/05/20 11:36
事务


事务的主要特征:任务要么全部完成,要么都不完成。
事务常用于数据库。在消息队列中写入消息,将数据写入文件或注册表 都可以使用事务完成。一个事务可以包含多个操作。
事务由事务管理器来管理和协调。每个影响事务结果的资源都由一个资源管理器来管理。事务管理器与资源管理器通信,定义事务的结果。
事务处理分为激活、准备和提交3个阶段。
激活阶段:在这个阶段创建事务。为资源管理事务处理的资源管理器可以用事务进行登记。
准备阶段:在这个阶段每个资源管理器都可以定义事务的结果。事务的创建者发出结束事务的指令时,就启动这个阶段。
提交阶段:当所有的资源管理器都成功准备好,就开始这个阶段。
事务的结果必须处于有效的状态。即使服务器断电了,也需要有有效状态。事务的特征可以用术语ACID定义。
Atomicity原子性:表示一个工作单元,在事务中要么整个工作单元都完成,要么都不完成。
Consistency一致性:事务开始前的状态和事务完成后的状态必须有效。在执行事务的过程中,状态可以有临时值。
Isolation隔离性:表示并发进行的事务处于独立状态,而状态在事务的处理过程中肯能发生变化。在事务未完成时,事务A看不到事务B的临时状态。
Durability持久性:在事务完成后,它必须以持久的方式存储起来。如果关闭电源或服务器崩溃,该状态在重新启动时必须恢复。
如果没有手动创建事务,每条sql语句都有一个事务。
  var con = new SqlConnection("");
            var comm = con.CreateCommand();
            SqlTransaction tx = con.BeginTransaction();
            try
            {
                comm.Transaction = tx;
                tx.Commit();
            catch (Exception ex)
            {
                tx.Rollback();
            }
EnterpriseService 可以进行自动事务处理。它使用事务的优点是不需要显示的进行事务处理,运行库会自动创建事务,只需要给有事务处理要求的类添加[Transaction]特性即可
[AutoComplete]特性把方法标记为自动设置事务的状态位:如果该方法成功,就设置成功位,以此可以提交,发生异常时,就终止事务。
Transaction是所有事务处理类的基类。CommittableTransaction是唯一一个支持提交的事务类。该类有一个Commit()方法,所有其他事务类都只能回滚。


网络


HttpClient类用于发送HTTP请求,接受请求的响应。
  HttpClient hc = new HttpClient();
            HttpResponseMessage response = null;
            response = await hc.GetAsync("http://services.odata.org/Northwind/Northwind.svc/Regions");
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine(response.Content);
            }
HttpClient对象是线程安全的,所有一个HttpClient可以用于处理多个请求。HttpClient的每个实例都维护它自己的线程池,所以HttpClient实例之间的请求会被隔离。
HttpClient的DefaultRequestHeaders属性允许设置或改变标题。使用Add方法可以集合添加标题。
 HttpClient hc = new HttpClient();
            hc.DefaultRequestHeaders.Add("Accept","application/json;odata=verbose");
            HttpResponseMessage response = null;
            response = hc.GetAsync("http://services.odata.org/Northwind/Northwind.svc/Regions").Result;
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine("Headers");
                response.Headers.ToList().ForEach(m =>
                {
                    Console.WriteLine(string.Join(",",m.Value));
                });
            }
使用浏览器打开指定网址
 Process p = new Process();
            p.StartInfo.FileName = "Chrome.exe";
            p.StartInfo.Arguments = "http://www.baidu.com";
            p.Start();
            WebBrowser wb=new WebBrowser();
            wb.Navigate("http://www.baidu.com",true);
Uri和UriBuilder用于表示URI.UriBuilder只允许构建一个完整的URI路径,或者把值赋给属性.Uri许多只读属性。
 Uri u = new Uri("https://www.zhihu.com/question.html?a=26582221");
 Dns与IPAddress
  IPHostEntry ipHost = Dns.GetHostEntry("www.baidu.com");
            ipHost.AddressList.ToList().ForEach(m =>
            {
                Console.WriteLine(m.AddressFamily.ToString()+"..."+m.ToString());
            });
SmptClient 博客Smpt例子地址http://blog.csdn.net/highplayer/article/details/6007656
SmtpClient sc=new SmtpClient();
            sc.Host = "mail.mySmptHost.com";//邮件服务
            MailMessage mm=new MailMessage();
            mm.From=new MailAddress("evjen@yahoo.com","BIll Evjen");//发送邮箱
            mm.To.Add(new MailAddress("editoe@wrox.com","Paul Reese"));
            mm.To.Add(new MailAddress("marketing@wrox.com","Wrox Marking"));
            mm.CC.Add(new MailAddress("publisher@wrox.com"));
            mm.Subject = "The latest chaper";
            mm.Body = "<b>我发送了邮件---我是程序发</p>";
            mm.IsBodyHtml = true;
            mm.Priority = MailPriority.High;
            //添加附件  
            Attachment a = new Attachment(@"I:/tt.txt");
            mm.Attachments.Add(a);
            sc.Timeout = 9999;
            sc.Send(mm);
Socket 这个底层的类用于管理连接。WebRequest、TcpClient、UdpClient等类在内部使用。
NetWorkStream 表示来自网络的数据流。
SmptClient 允许通过SMPT发送消息邮件。
TcpClient 允许创建和使用TCP连接。
TcpListener 允许侦听引入的TCP连接。
UdpClient 为Udp客户创建连接。
传输控制协议TCP类为连接和发送两个端点之间的数据提供了简单的方法。端点是IP地址和端口号的组合。
TCP提供了有保证的传输、错误校正和缓冲。TcpClient类封装了TCP连接,提供了许多属性来控制连接,包括缓冲、缓冲区大小和超时。通过GetStream()方法请求NetworkStream对象实现读写功能。
TcpListener类用Start()方法侦听引入的TCP连接。当连接请求到达时,可以使用AcceptSocket()方法返回一个套接字
或使用AcceptTcpClient()方法通过高层的TcpClient对象进行通信。
TcpClient示例:
 TcpClient tc=new TcpClient("127.0.0.1",8885);
            NetworkStream ns=tc.GetStream();
            FileStream fs = File.Open(@"I:/tt.txt", FileMode.Open);
            int data = fs.ReadByte();
            while (data!=-1)
            {
                ns.WriteByte((byte)data);
                data = fs.ReadByte();
            }
            fs.Close();
            ns.Close();
            tc.Close();
TcpListener示例
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            Int32 port = 2112;
            TcpListener tl=new TcpListener(localAddr,port);
            tl.Start();
            TcpClient tc = tl.AcceptTcpClient();
            NetworkStream ns = tc.GetStream();
            StreamReader sr=new StreamReader(ns);
            string result = sr.ReadToEnd();
            tc.Close();
            tl.Stop();
UDP用户数据报协议,在速度与性能要求比可靠性高的程序中使用UDP,它是一个无连接的协议.
 IPEndPoint localIpep = new IPEndPoint(
                  IPAddress.Parse("127.0.0.1"), 12345); // 本机IP,指定的端口号
            udpcSend = new UdpClient(localIpep);


            Thread thrSend = new Thread(SendMessage);
            thrSend.Start("hello");
            localIpep = new IPEndPoint(
                    IPAddress.Parse("127.0.0.1"), 8848); // 本机IP和监听端口号


            udpcRecv = new UdpClient(localIpep);


            var ss = new Thread(ReceiveMessage);
            ss.Start();
   private static void SendMessage(object obj)
        {
            string message = (string)obj;
            byte[] sendbytes = Encoding.Unicode.GetBytes(message);


            IPEndPoint remoteIpep = new IPEndPoint(
                IPAddress.Parse("127.0.0.1"), 8848); // 发送到的IP地址和端口号


            udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep);
            udpcSend.Close();
        }
        private static void ReceiveMessage(object obj)
        {
            IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                try
                {
                    byte[] bytRecv = udpcRecv.Receive(ref remoteIpep);
                    string message = Encoding.Unicode.GetString(
                        bytRecv, 0, bytRecv.Length);
                    Console.WriteLine(message);
                }
                catch (Exception ex)
                {
                    break;
                }
            }
        }
0 0
原创粉丝点击