What’s the deal with the C# “using” construct?
We spent a little bit of time today talking about the “using” construct and potential problems and confusion that people have been having with it. For those who don’t know, the “using” statement is a simple C# construct that provides concise syntax for a very common pattern. Specifically, the C# language specification says that it will convert code with the following structure:
using ( expression ) statement
into
ExpressionType temp = expression; try { statement } finally { if (temp != null) { ((IDisposable)temp).Dispose(); } }
This allows you to concisely work with a resource that needs to be disposed in a timely fashion. A good example of this are things like file handles. There are a limited number that the OS can give out, and it’s quite possible to run out of them if you haphazardly request them and then depend on the garbage collector to clean them up for you. Now, in a perfect world, the GC would be aware of non-memory resources and it would reclaim things like handles when they were no longer being used by you. However, in today’s world that’s not how things work so the “using” construct can be used in conjunction with the IDisposable interface pattern to accomplish that.
Now, we could have not introduced the “using” construct, however without it code tends to get incredibly messy. Consider if you are using two disposable resources, the code then becomes:
ExpressionType1 temp1 = expression1; try { ExpressionType temp2 = expression2; try { statement } finally { if (temp2 != null) { ((IDisposable)temp2).Dispose(); } } } finally { if (temp1 != null) { ((IDisposable)temp1).Dispose(); } }
Bleagh! That’s pretty awful. With “using” you can write that as:
using (ExpressionType1 name1 = expression1, name2 = expression2) statement
or, alternatively
using (expression1) using (expression2) statement
(personally, I prefer the latter). That’s a heck of a lot more concise and far easier to grok.
So, what’s the problem that people have been having with the “using” construct? Well, as you may have already noticed there’s a potential problem whereby a resource you’ve acquired is not released in a timely manner. When can that happen? Well consider the following:
ExpressionType temp = expression; //asynchronous exception (like ThreadAbortException) is thrown now try { statement } finally { if (temp != null) { ((IDisposable)temp).Dispose(); } }
Uh-oh. We have a problem. You’ve acquired the resource in “expression”, but before entering the “try” some asynchronous exception occurs and so the resource is never disposed. At first glance it seems like there is a trivial fix for this. Simply change the code transformation so that it generates:
ExpressionType temp = null; try { temp = expression; statement } finally { if (temp != null) { ((IDisposable)temp).Dispose(); } }
Terrific right? Now if an asynchronous exception occurs after “expression” is invoked, we’ll be inside the “try” and so the “finally” block will execute and clean up the resource for us. Unfortunately, that’s still not the case! How so? Well consider the following:
ExpressionType temp = null; try { temp = /*async-exception thrown before assignment occurs*/ expression; statement } finally { if (temp != null) { ((IDisposable)temp).Dispose(); } }
Sigh… The resource has been acquired, but when the “finally” runs “temp” will still be null, and nothing will get disposed at that time.
OMG! The sky is falling! The sky is falling!
Seems like you’re in a horrible position here right!? How on earth will you know if your resources are going to be cleaned up? Are we now in a world where you’re going to be leaking resources and you’re not going to be able to trust your managed code?
Fortunately, no, things are not as dire as they seem. Why? Well, first let’s start with an assumption. If you are writing code that follows the .Net guidelines, and you listen to tools like FxCop, then you’re going to be writing your classes that implement IDisposable as recommended in the MSDN documentation.
What this means is that even if you forget, or fail (because of an asynchronous exception), to explicitly call “Dispose” on the resource it will be ok because the GC will eventually finalize your object which will end up doing the same.
But wait a minute. Didn’t I just say that depending on the GC to clean up critical resources was a bad practice since you might run out of resources before the GC kicks in? Yes I did. However, the difference here is that if you have the bad luck to run into this asynchronous exception problem you stand the chance of not disposing at most a couple of disposable objects. And the chance of those few objects causing you to be unable to acquire any more resources is exceedingly slim. Contrast that with code that just does something like this:
while (true) { AcquireResource(); }
In this case you’re going to be leaking tons and tons of resources and it will very quickly become a problem for you. In the asynchronous case you will be leaking a worst a couple of resources, and they will almost certainly be reclaimed before they could ever be a problem.
It should also be noted that these asynchronous exceptions occur in extremely bad situations (like a thread dying). And, in native code, it’s often extremely difficult to recover from this at all. The managed world allows you to have a good balance. When an error occurs you may leak a resource, but even so it will quickly be reclaimed soon afterwards.
So if you’ve ever seen the transformation done by the C# compiler and wondered why it did what it did, well now you know.
Any thoughts or questions on this stuff?
Comments
- Anonymous
May 09, 2005
The one problem that I have for using "using" is the lack of support for transactions.
When code goes out of a using block, there is no way to know if it was from an abnormal termination (exception) or a normal exit. If this were known, the Dispose() call could perform a commit or rollback as needed.
The System.Transaction guys have a ITransaction interface that derives IDisposable and includes a Rollback method--or something like that. If "Using" were to recognize the ITransaction pattern then it could actually do the right thing, rather than assume abnormal termination is normal. - Anonymous
May 09, 2005
Wesner: I haven't given it a lot of thought, but why can't you have:
class Transaction : IDisposable {
...bool committed = false;
...void Commit() {
......committed = true;
...}
...void Dispose() {
......if (!committed) {
.........Abort();
......}
...}
}
then you can do this:
using (Transaction t = ...) {
...//do some stuff
...//and, if everything goes right
...t.Commit();
}
? - Anonymous
May 09, 2005
The comment has been removed - Anonymous
May 09, 2005
The comment has been removed - Anonymous
May 10, 2005
The comment has been removed - Anonymous
May 10, 2005
We use using heaps - as it almost gives you a concept similar to anyonymous methods.
One thing that's always annoyed me, and it's more about exception handling than using, but we run up against it every day - there should be a way you can ask in a finally block "did an exception occur"
For example - we do use using for transactions. So we have
using (Ambient transaction block = AmbientTransaction.Called("Update prices"))
{
...
block.Commit();
}
and we do the obvious stuff in the dispose.
What really annoys me, and I've tried every weird thing I can think of, is I can't do what I really want to do and say "a transaction is committed if an exception doesn't occur". I really want to write:
using (AmbientTransaction.Called("Update Prices"))
{
...
}
And it really bothers me that (as far as I can tell) it can't be done. - Anonymous
May 10, 2005
public struct SafeDatabaseHandle : IDisposable
{
private IDbConnection connection;
public SafeDatabaseHandle(IDbConnection connection)
{
this.connection = connection;
this.connection.Open();
}
public SafeDatabaseHandle(IDbCommand command) : this(command.Connection)
{
}
public void Dispose()
{
this.connection.Close();
}
}
SqlCommand cmd = new SqlCommand("UPDATE BLAH", conn);
using (new SafeDatabaseHandle(cmd))
{
cmd.ExecuteNonQuery();
} - Anonymous
May 10, 2005
Woops, forgot to actually write:
I use the above code as a way of closing DB connections. Keeps a lot of DB code clean and succinct. - Anonymous
May 10, 2005
The comment has been removed - Anonymous
June 08, 2005
RePost:
http://www.yeyan.cn/Programming/CSharpUsingConstruct.aspx - Anonymous
August 21, 2005
[url=http://www.ocnwave.net/]网页制作[/url] - Anonymous
August 21, 2005
The comment has been removed - Anonymous
August 24, 2005
<font size="5" face="黑体"><strong> <a href="http://www.emt.com.cn">http://www.emt.com.cn">http://www.emt.com.cn">http://www.emt.com.cn">动平衡仪</a>">http://www.emt.com.cn">http://www.emt.com.cn">http://www.emt.com.cn">http://www.emt.com.cn">动平衡仪</a> <a href="http://www.aobsoft.com">速达</a>">http://www.aobsoft.com">速达</a> <a href="http://www.atlus.com.cn">http://www.atlus.com.cn">贴纸相机</a>">http://www.atlus.com.cn">http://www.atlus.com.cn">贴纸相机</a> <a href="http://www.tcaccp.com">北大青鸟</a>">http://www.tcaccp.com">北大青鸟</a> <a href="http://www.mhsho.com">保洁</a>">http://www.mhsho.com">保洁</a> <a href="http://www.ectraining.cn">http://www.ectraining.cn">电脑培训</a>">http://www.ectraining.cn">http://www.ectraining.cn">电脑培训</a> <a href="http://www.ectraining.cn">http://www.ectraining.cn">计算机培训</a>">http://www.ectraining.cn">http://www.ectraining.cn">计算机培训</a> <a href="http://www.mdjkehai.com">无功补偿</a>">http://www.mdjkehai.com">无功补偿</a> <a href="http://beauty.xicn.net">图片</a>">http://beauty.xicn.net">图片</a> <a href="http://joke.xicn.net">笑话</a>">http://joke.xicn.net">笑话</a> <a href="http://www.ctranslation.com">http://www.ctranslation.com">translation</a>">http://www.ctranslation.com">http://www.ctranslation.com">translation</a> <a href="http://www.ctranslation.com">http://www.ctranslation.com">chinese">http://www.ctranslation.com">http://www.ctranslation.com">chinese translation</a> <a href="http://www.bl1688.com">http://www.bl1688.com">工艺品</a>">http://www.bl1688.com">http://www.bl1688.com">工艺品</a> <a href="http://www.bl1688.com">http://www.bl1688.com">礼品</a>">http://www.bl1688.com">http://www.bl1688.com">礼品</a> <a href="http://www.nbzone.com.cn">ibm笔记本</a>">http://www.nbzone.com.cn">ibm笔记本</a> <a href="http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">红外测温仪</a>">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">红外测温仪</a> <a href="http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn">http://www.df18.com.cn"> - Anonymous
August 26, 2005
[url=http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/">http://www.88tm.com/"> - Anonymous
September 01, 2005
http://mfdyyy.zj.com/zp.htm
http://mfdyyy.zj.com/crxs.htm
http://mfdyyy.zj.com/hsxs.htm
http://mfdyyy.zj.com/index01.htm
http://mfdyyy.zj.com/index02.htm
http://mfdyyy.zj.com/index03.htm
http://mfdyyy.zj.com/index05.htm
http://mfdyyy.zj.com/index06.htm
http://mfdyyy.zj.com/index07.htm
http://mfdyyy.zj.com/index08.htm
http://mfdyyy.zj.com/index09.htm
http://mfdyyy.zj.com/index10.htm
http://mfdyyy.zj.com/index11.htm
http://mfdyyy.zj.com/index12.htm
http://mfdyyy.zj.com/index13.htm
http://mfdyyy.zj.com/index15.htm
http://mfdyyy.zj.com/jqdy.htm
http://mfdyyy.zj.com/kddy.htm
http://mfdyyy.zj.com/kdy.htm
http://mfdyyy.zj.com/kdyy.htm
http://mfdyyy.zj.com/mfdy.htm
http://mfdyyy.zj.com/mfyy.htm
http://mfdyyy.zj.com/mxxz.htm
http://mfdyyy.zj.com/nx.htm
http://mfdyyy.zj.com/rtxz.htm
http://mfdyyy.zj.com/rtys.htm
http://mfdyyy.zj.com/sjdy.htm
http://mfdyyy.zj.com/sjp.htm
http://mfdyyy.zj.com/sqxs.htm
http://mfdyyy.zj.com/swdy.htm
http://mfdyyy.zj.com/xdy.htm
http://mfdyyy.zj.com/xsh.htm
http://mfdyyy.zj.com/xzdy.htm
http://mfdyyy.zj.com/xzmfdy.htm
http://mfdyyy.zj.com/yqdy.htm
http://mfdyyy.zj.com/tt.htm
http://mfdyyy.zj.com/xz.htm
http://mfdyyy.zj.com/lt.htm
http://mfdyyy.zj.com/mv.htm
http://mfdyyy.zj.com/splt.htm
http://mfdyyy.zj.com/qqsplt.htm
http://mfdyyy.zj.com/tj.htm
http://mfdyyy.zj.com/hj.htm
http://mfdyyy.zj.com/jy.htm
http://mfdyyy.zj.com/mmo.htm
http://mfdyyy.zj.com/mx.htm
http://mfdyyy.zj.com/sk.htm
http://mfdyyy.zj.com/hp.htm
网站越办越好
http://mfdyy8.blogsky.com
http://rtyss8.blogsky.com
http://spltt8.blogsky.com
http://wyzpp8.blogsky.com
http://crdyy8.blogsky.com
http://crdyy88.blogsky.com
http://crltt8.blogsky.com
http://crxss8.blogsky.com
http://hsdyy8.blogsky.com
http://sqdyy8.blogsky.com
http://mfhsdya8.blogsky.com
http://mfcrdya8.blogsky.com
http://mfsqdya8.blogsky.com
http://crxssso.ebloggy.com
http://crltttan.ebloggy.com
http://crdyyy.ebloggy.com
http://hsdyy8.ebloggy.com
http://sqdyyy8i.ebloggy.com
http://crtppp8.ebloggy.com
http://mfdyy888.ebloggy.com
http://wyzpp.ebloggy.com
http://rtysu888.ebloggy.com
http://my520.ebloggy.com
http://xdyyy.ebloggy.com
http://splttt88.ebloggy.com
http://crdyyyaa.ebloggy.com
http://crltttaaa8.ebloggy.com
http://meinv1233.blogsky.com
http://mfdy168.blogsky.com
http://qijianmianfei.yculblog.com
http://meinvxiez.mblogger.cn
http://chengrltt.ebloggy.com
http://chengrendiany.ebloggy.com
http://chengrenxiaosuo.ebloggy.com
http://xiaodiany.yculblog.com
http://shipingliaotian.ebloggy.com
http://mvvvv123.yculblog.com
http://spltty88.yculblog.com
http://rtysss88.yculblog.com
http://wyzppp8.yculblog.com - Anonymous
June 01, 2009
PingBack from http://woodtvstand.info/story.php?id=7457