К основному контенту

Dispose pattern to file reading in C#:

This is how to implement dispose pattern to file reading in C#:

using System;
using System.IO;

class BaseResource: IDisposable
{
// Track whether Dispose has been called.
private bool disposed = false;

// The unmanaged resource wrapper object
private FileStream file;

// Class constructor
public BaseResource(String fileName)
{
Console.WriteLine("BaseResource constructor allocates unmanaged resource wrapper");
file = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
}

// Implement IDisposable
public void Dispose()
{
// Check to see if Dispose has already been called.
if (!disposed)
{
Console.WriteLine("Dispose pattern releases unmanaged resource wrapper's resource");
file.Close();
disposed = true;
}
}

public void Close()
{
Dispose();
}

public void DoSomething()
{
Console.WriteLine("In BaseResource.DoSomething");
}
}

Also in some ways, calling Dispose() or Close() multiple times is completely harmless. However, this implementation of the dispose pattern is not thread-safe. Another thread could start disposing the object after the unmanaged resource wrappers are disposed, but before the internal disposed field is set to true. If you were writing a class for use in a multi-threaded application and were ensuring the class was thread-safe then this is how you would do it for the Dispose() method. The following modification to Dispose() remedies this by locking the object for the method's duration to prevent any other threads calling Dispose() at the same time.

Here is the C# rewrite:

// Implement IDisposable
public void Dispose()
{
lock(this)
{
// Check to see if Dispose has already been called.
if (!disposed)
{
Console.WriteLine("Dispose pattern releases unmanaged resource wrapper's resource");
file.Close();
disposed = true;
}
}
}
Source: http://edn.embarcadero.com/article/29365

Комментарии

Популярные сообщения из этого блога

10 Interviewing Rules

By Carole Martin, Monster Contributing Writer ----- In the current job market, you'd better have your act together, or you won't stand a chance against the competition. Check yourself on these 10 basic points before you go on that all-important interview. Look Sharp Before the interview, select your outfit. Depending on the industry and position, get out your best duds and check them over for spots and wrinkles. Even if the company has a casual environment, you don't want to look like you slept in your clothes. Above all, dress for confidence. If you feel good, others will respond to you accordingly. Be on Time Never arrive late to an interview. Allow extra time to arrive early in the vicinity, allowing for factors like getting lost. Enter the building 10 to 15 minutes before the interview. Do Your Research Researching the company before the interview and learning as much as possible about its services, products, customers and competition will give you an edge in understand...

Catastrophic backtracking в регулярных выражениях

Можно ли простой и вроде невинной регуляркой убить систему? Да, можно. Например: >>> r = '(a+)*b' Просто — да. Невинно — вроде да. Конечно неумно, потому что скобки и звездочка лишние, но должно работать. Попробуем: >>> re.findall('(a+)*b', 'aaaaaab') ['aaaaaa'] Круто, работает, пошли пить пиво. А нет… Если строка, в которой ищем, не будет содержать искомого паттерна, например просто 'aaaaaa', компилятор будет пробовать найти её следующим алгоритмом: 1. Вся стока удовлетворяет 'a+', но мы не находим 'b', шаг назад. 2. Теперь 'a+' удовлетворяет только 'aaaaa' (все, кроме последней), последняя удовлетворяет повтору '*', 'b' все равно не находим, шаг назад. 3. Первое 'a+' удовлетворяет только 'aaaa', последние два 'aa' удовлетворяют повтору '*', 'b' все равно не находим, шаг назад. 4. Первое 'a+' удовлетворяет 'aa...