事务
事务的主要特征:任务要么全部完成,要么都不完成。
事务常用于数据库。在消息队列中写入消息,将数据写入文件或注册表 都可以使用事务完成。一个事务可以包含多个操作。
事务由事务管理器来管理和协调。每个影响事务结果的资源都由一个资源管理器来管理。事务管理器与资源管理器通信,定义事务的结果。
事务处理分为激活、准备和提交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("
[email protected]","BIll Evjen");//发送邮箱
mm.To.Add(new MailAddress("
[email protected]","Paul Reese"));
mm.To.Add(new MailAddress("
[email protected]","Wrox Marking"));
mm.CC.Add(new MailAddress("
[email protected]"));
mm.Subject = "The latest chaper";
mm.Body = "
我发送了邮件---我是程序发";
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;
}
}
}