Trang chủ » CSharp » C# Kinh nghiệm và Thủ thuật phần 3

C# Kinh nghiệm và Thủ thuật phần 3


Trước đó : Phần 2

1.Lấy code của 1 trang web

using System;
using System.Net;
using System.Text;
using System.IO;
 
namespace Test {
 
   class GetWebPage {
      public static void Main(string[] args) {
         for(int i=0;i<args.Length;i++) {
            HttpWebRequest httpWebRequest =
               (HttpWebRequest)WebRequest.Create(args[i]);
 
            HttpWebResponse httpWebResponse =
                    (HttpWebResponse)httpWebRequest.GetResponse();
 
            Stream stream = httpWebResponse.GetResponseStream();
 
            StreamReader streamReader =
               new StreamReader(stream, Encoding.ASCII);
            Console.WriteLine(streamReader.ReadToEnd());
         }
 
         Console.Read();
      }
   }
 
}

2.Giải phóng nhanh thành phần COM

Bạn cần bảo đảm một thành phần COM được xóa khỏi bộ nhớ ngay tức thì, không phải chờ bộ thu gom rác ( Garbage Collector ) làm việc. Hoặc bạn muốn bảo đảm các đối tượng COM được giải phóng theo một thứ tự xác định. Khi đó, hãy sử dụng phương thức tĩnh…
Bạn cần bảo đảm một thành phần COM được xóa khỏi bộ nhớ ngay tức thì, không phải chờ bộ thu gom rác (Garbage Collector) làm việc. Hoặc bạn muốn bảo đảm các đối tượng COM được giải phóng theo một thứ tự xác định. Khi đó, hãy sử dụng phương thức tĩnh Marshal.ReleaseComObject và truyền RCW thích hợp để giải phóng tham chiếu đến đối tượng COM nằm dưới.
COM sẽ đếm các tham chiếu đến đối tượng để xác định khi nào đối tượng sẽ được giải phóng. Khi bạn sử dụng một RCW, tham chiếu sẽ được giữ cả khi biến đối tượng vượt khỏi tầm vực. Tham chiếu này chỉ được giải phóng khi bộ thu gom rác giải phóng đối tượng RCW. Do đó, bạn không thể kiểm soát việc các đối tượng COM sẽ được giải phóng khi nào hoặc theo thứ tự nào.
Để vượt qua hạn chế này, bạn có thể sử dụng phương thức Marshal.ReleaseComObject. Trong ví dụ sau, bạn sẽ thấy hai dòng sau ở cuối mã lệnh để giải phóng đối tượng Recordset và Connection nằm dưới.

rshal.ReleaseComObject(rs);  
rshal.ReleaseComObject(con); 

Về mặt kỹ thuật, phương thức ReleaseComObject không thực sự giải phóng đối tượng COM, nó chỉ giảm số lượng tham chiếu đến đối tượng. Nếu số tham chiếu là 0, đối tượng COM sẽ được giải phóng. Tuy nhiên, nếu cùng thể hiện của một đối tượng COM được sử dụng tại nhiều mẩu mã lệnh, nó phải được giải phóng ở các nơi đó trước khi được giải phóng khỏi bộ nhớ.

 
   using System;  
   public class ADOClassic {  
   private static void Main() {  
   ADODB.Connection con = new ADODB.Connection(); string connectionString = "Provider=SQLOLEDB.1;" + "Data Source=localhost;" +"Initial Catalog=Northwind;Integrated Security=SSPI";  
   con.Open(connectionString, null, null, 0);  
   object recordsAffected;  
   ADODB.Recordset rs = con.Execute("SELECT * From Customers", out recordsAffected, 0);  
    while (rs.EOF != true) {  
    Console.WriteLine(rs.Fields["CustomerID"].Value);  
   rs.MoveNext();  
   }  
   Console.ReadLine();  
   Marshal.ReleaseComObject(rs);  
   Marshal.ReleaseComObject(con);  
   }  
   }  
Advertisements

Bình luận

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s