首页 > 代码库 > [转载]How to avoid using() mistake in C#?
[转载]How to avoid using() mistake in C#?
转载自http://blog.csdn.net/mikechenhua/article/details/42568893
As we know that in C# using() is suggested to avoid resourceleak or other good purposes, but in some cases it may be not suitable to use it,let me describe some of such kind of scenarios:
Assume that we have one MainForm which is the main windows of our App, which has 3 buttons on the UI and there is one child form ChildForm, which has one close button on the UI:
Design MainForm.cs as following code:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void usingChildForm_Click(object sender, EventArgs e)
{
using (ChildForm myForm = new ChildForm())
{
myForm.Show();// Inthis case, the child form will be disposed immediately, the user will have nochance to click Close button on it.
}
}
public static void SyncThreadMethod()
{
Thread.Sleep(10000);
MessageBox.Show("I am in Sync thread method.");
}
private void syncThreadButton_Click(object sender, EventArgs e)
{
using (DispoableThread thrd1 = new DispoableThread(new ThreadStart(SyncThreadMethod)))
{
thrd1.Start();
thrd1.Join();// Inthis case, using() will wait until Sync thread calling is completed, thendispose thrd1. So “I am in Sync thread method.” will befirst, then “I am in Thread Dispose().”
}
}
private void asyncThreadButton_Click(object sender, EventArgs e)
{
using (DispoableThread thrd1 = new DispoableThread(new ThreadStart(SyncThreadMethod)))
{
thrd1.Start();// Inthis case, using will also dispose(abort) thrd1 immediately, so only “I am in Thread Dispose().” is showed.
}
}
}
public class DispoableThread : IDisposable
{
Thread trd = null;
public DispoableThread(ThreadStart ts)
{
trd = new Thread(ts);
}
public void Start()
{
trd.Start();
}
public void Join()
{
trd.Join();
}
public void Dispose()
{
trd.Abort();
MessageBox.Show("I am in Thread Dispose().");
}
}
ChildForm.cs has:
public partial class ChildForm : Form
{
public ChildForm()
{
InitializeComponent();
}
private void closeButton_Click(object sender, EventArgs e)
{
this.Close();
}
}
You will found only when button “Using Sync Thread”isclicked, the using() can work correctly as we expected. In the other 2 cases,the using() will dispose the object declared in its scope no matter if the tasksinside its brackets is done or not.
转载自http://blog.csdn.net/mikechenhua/article/details/42568893
[转载]How to avoid using() mistake in C#?