当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪GC的三代回收机制      三代回收机制为了提升垃圾回收的效率,微软做了很多的优化。一个很重要的功能就是三代回收机制。对于这个机制,GC做了一下几个假设:越新的对象,生存周期会越短越老的对象,生存周.........
    ▪关于AutoResetEvent的使用      AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,.........
    ▪DataGridView实现行的上移下移置顶         处男贴,写的不好,请多指教。 1 private void btn_MoveFirst_Click(object sender, EventArgs e) 2 { 3 if (Dgv_Session.SelectionMode == DataGridViewSelectionMode.FullRowSelect) 4 { 5 .........

[1]GC的三代回收机制
    来源:    发布时间: 2013-10-22

三代回收机制

为了提升垃圾回收的效率,微软做了很多的优化。一个很重要的功能就是三代回收机制。对于这个机制,GC做了一下几个假设:

  • 越新的对象,生存周期会越短
  • 越老的对象,生存周期会越长
  • 新创建的对象,和其它对象关联性强越强,他被访问的频率越高
  • 移动内存的一部分要比移动整个托管堆要快

当然,很多学者都认为这些假设在大多数情况下是正确的,因此我们下面来讨论一下这些假设怎样影响GC的。

当GC初始化的时候,托管堆没有任何对象。加到托管堆中的对象被认为是0代(Generation 0),你可以看到Figure2。0代的对象都是新的对象,并且没有被GC检查过的对象。

当GC执行回收的时候,所有没有被回收的对象会集中在堆栈的最底端。这些对象幸存了下来,是比较老的对象,因此被认为是1代(Generation 1)。Figure3

当更多的对象被创建的时候,这些新创建的对象被放在堆栈的顶端,作为0代。当GC被再次执行的时候,1代中幸存下来的对象变成了2代,0代幸存下来的变成1代。Figure4。这时候0代为空,新创建的对象为0代。

现在,2代是GC主机吃的最高代了,GC再次运行的时候,2代里面幸存的对象仍然是2代。

 

 下面的代码是MSDN上的GC的demo

using System;

namespace GCCollectIntExample
{
class MyGCCollectClass
{
private const long maxGarbage = 1000;

static void Main()
{
MyGCCollectClass myGCCol = new MyGCCollectClass();

// Determine the maximum number of generations the system
// garbage collector currently supports.
Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

myGCCol.MakeSomeGarbage();

// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

// Perform a collection of generation 0 only.
GC.Collect(0);

// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

// Perform a collection of all generations up to and including 2.
GC.Collect(2);

// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
Console.Read();
}

void MakeSomeGarbage()
{
Version vt;

for (int i = 0; i < maxGarbage; i++)
{
// Create objects and release them to fill up memory
// with unused objects.
vt = new Version();
}
}
}
}

  运行结果

本文链接


    
[2]关于AutoResetEvent的使用
    来源: .net/c#/asp.net iis7站长之家   发布时间: 2013-10-22

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止
状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。

定义委托线程:   

public delegate void AsyncDelegate();

 try
        {
            AsyncDelegate dlgt1 = new AsyncDelegate(GetPolicyInfo);
            IAsyncResult ar1 = dlgt1.BeginInvoke(null, null);
            AsyncDelegate dlgt2 = new AsyncDelegate(GetFDPriceInfo);
            IAsyncResult ar2 = dlgt2.BeginInvoke(null, null);
            AsyncDelegate dlgt3 = new AsyncDelegate(LiuKouQuery);
            IAsyncResult ar3 = dlgt3.BeginInvoke(null, null);
            AsyncDelegate dlgt4 = new AsyncDelegate(PolicyCoordinationQuery);
            IAsyncResult ar4 = dlgt4.BeginInvoke(null, null);
            ar1.AsyncWaitHandle.WaitOne();
            dlgt1.EndInvoke(ar1);
            ar2.AsyncWaitHandle.WaitOne();
            dlgt2.EndInvoke(ar2);
            ar3.AsyncWaitHandle.WaitOne();
            dlgt3.EndInvoke(ar3);
            ar4.AsyncWaitHandle.WaitOne();
            dlgt4.EndInvoke(ar4);
            CombinePolicyAndPrice();
        }
        catch
        {

        }
        finally
        {
            AutoResetEvent are = (AutoResetEvent)o;
            are.Set();
        }

本文链接


    
[3]DataGridView实现行的上移下移置顶
    来源:    发布时间: 2013-10-22

   处男贴,写的不好,请多指教。

1 private void btn_MoveFirst_Click(object sender, EventArgs e)
2 {
3 if (Dgv_Session.SelectionMode == DataGridViewSelectionMode.FullRowSelect)
4 {
5 int[] Num = new int[Dgv_Session.SelectedRows.Count];
6 for (int i = 0; i < Dgv_Session.SelectedRows.Count; i++)
7 {
8 Num[i] = Dgv_Session.SelectedRows[i].Index;
9 }
10 if (Num.Length > 0)
11 {
12 for (int i = Num.Length - 1; i >= 0; i--)
13 {
14 if (Num[i] <= 0)
15 {
16 return;
17 }
18 else
19 {
20 ArrayList al = new ArrayList();
21 for (int j = 0; j < _dt_session.Rows[Num[i]].ItemArray.Length; j++)
22 {
23 al.Add(_dt_session.Rows[Num[i]][j].ToString());
24 }
25 DataRow tempRow = _dt_session.NewRow();
26 for (int j = 0; j < al.Count; j++)
27 {
28 tempRow[j] = al[j];
29 }
30 _dt_session.Rows.InsertAt(tempRow, Num[i] - Num[Num.Length - 1]);
31 _dt_session.Rows.RemoveAt(Num[i] + 1);
32 Dgv_Session.ClearSelection();
33 Dgv_Session.Rows[0].Selected = true;
34 Dgv_Session.DataSource = _dt_session;
35 }
36 }
37 }
38 }
39 }
40
41 private void btn_MoveUp_Click(object sender, EventArgs e)
42 {
43 if (Dgv_Session.SelectionMode == DataGridViewSelectionMode.FullRowSelect)
44 {
45 int[] Num = new int[Dgv_Session.SelectedRows.Count];
46 for (int i = 0; i < Dgv_Session.SelectedRows.Count; i++)
47 {
48 Num[i] = Dgv_Session.SelectedRows[i].Index;
49 }
50 if (Num.Length > 0)
51 {
52 for (int i = Num.Length - 1; i >= 0; i--)
53 {
54 if (Num[i] <= 0)
55 {
56 return;
57 }
58 else
59 {
60 ArrayList al = new ArrayList();
61 for (int j = 0; j < _dt_session.Rows[Num[i]].ItemArray.Length; j++)
62 {

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3