'2017/07'에 해당되는 글 4건

Programming/.NET

프로그램안에서 어떤 사건(처리)가 발생했을때 자동으로 특정 메서드를 호출하는 것이 이벤트의 개념입니다. 가장 단순하게는 윈폼 계열등의 프로그램에서 버튼클릭과 같은 경우를 예로 들 수 있겠습니다. 사용자가 버튼을 클릭하면 '클릭'했다는 사건이 발생한 것이고 그에대한 메서드가 호출되어 원하는 처리르 진행하는 것입니다.

 

이벤트를 구현하기 위해서는 우선 이벤트를 연결할 대상을 다음과 같이 정의해야 합니다.

 

static event EventHandler myEvent;

 

그리고 이벤트가 발생했을때 실제 호출될 이벤트 처리기 메서드를 작성해야 하는데 해당 메서드는 이벤트를 발생시킨 대상과 이벤트 처리시 추가적인 인자를 받을 매개변수를 지정해서 작성해야 합니다.

 

    static void SumPrint(object sender, EventArgs arg)
    {
        Console.WriteLine("aaa");
    }

 

그리고 해당 메서드를 이벤트에 추가시키고(제거할때는 -= 연산자를 사용할 수 있습니다.)

 

myEvent += SumPrint;

 

특정 상황이 발생했을때 다음과 같이 이벤트를 호출하도록 합니다.

 

myEvent(null, null);

 

예제는 따로 sender와 arg에 필요한 인자전달이 필요없기에 이걸 null로 처리했지만 필요하다면 EventArgs를 상속받도록 클래스를 만들고

 

class myClass : EventArgs
{
    public int myValue;

    public myClass(int myValue)
    {
        this.myValue = myValue;
    }
}

 

이벤트 호출시 해당 클래스를 인자로 전달하여

 

myEvent(null, new myClass(10));

 

원하는 동작을 수행하도록 합니다.

 

    static void SumPrint(object sender, EventArgs arg)
    {
        Console.WriteLine((arg as myClass).myValue.ToString());
    }

 

'Programming > .NET' 카테고리의 다른 글

[C#] ?? 연산자  (0) 2017.08.10
[C#] 형변환(캐스팅 - Casting)  (0) 2017.08.01
[C#] 이벤트(event)  (0) 2017.07.26
[C#] Directory 와 DirectoryInfo 클래스  (0) 2017.07.19
[Visual Studio] Immediate Window  (0) 2017.07.12
[ASP.NET] SQL Server 캐시 종속성  (0) 2017.07.04
0 0
Programming/.NET

Directory는 디렉토리를 대상으로 생성, 삭제등의 작업을 수행하거나 디렉토리의 생성날짜와 같은 속성정보를 알 수 있는 클래스이며 DirectoryInfo는 특정 디렉토리에 대한 하위 파일 또는 디렉토리구조를 확인할 수 있는 클래스입니다.

 

일반적으로 디렉토리에 대한 생성이나 삭제는 Directory클래스의 정적 메소드를 이용하며

 

Directory.CreateDirectory("C:\\aaa");

디렉토리의 속성정보또한 정적메소드를 통해 확인할 수 있습니다.

 

Label1.Text = Directory.GetCreationTime("C:\\aaa").ToString();

DirectoryInfo를 통해 특정 디렉토리의 하위디렉토리 구조를 가져오려면 GetdIrectories메소드를 호출합니다.

 

DirectoryInfo di = new DirectoryInfo("C:\\");
foreach (System.IO.DirectoryInfo d in di.GetDirectories()) {
    TreeNode tn = new TreeNode(d.Name);
    treeView1.Nodes.Add(tn);
}

 

이 예제는 C 드라이브의 루트디렉토리 목록을 가져와 TreeView컨트롤에 추가하도록 합니다. 에제에서 사용된 GetDirectories 메소드는 필요한 디렉토리 목록을 가져오기 위해 실제 디렉토리 목록만큼의 배열을 할당하여 목록을 할당된 배열에 채워넣은 뒤 결과값을 반환합니다.

 

단순배열이므로 가져올 목록이 많으면 성능상 불이익이 발생될 수 있는데 이런 경우 EnumerateDirecotories 메소드를 사용할 수 있습니다. EnumerateDirecotories 메소드는 List형식의 열거형을 반환합니다.

 

foreach (DirectoryInfo d in di.EnumerateDirectories()) {
    TreeNode tn = new TreeNode(d.Name);
    TreeView1.Nodes.Add(tn);
}

 

디렉토리와 관련된 클래스를 이용하는 경우 작업대상 디렉토리의 기준은 현재 실행중인 디렉토리를 기준으로 합니다. 이 위치는 Directory의 GetCurrentDirectory 메소드를 호출함으로써 알 수 있는데 이를 이용해 현재 디렉토리에 aaa 라는 폴더를 생성하고 싶으면 다음과 같이 구현할 수 있습니다.

 

Directory.CreateDirectory(Directory.GetCurrentDirectory() + @"\aaa"));

 

만약 이 작업대상 기준을 바꾸려면 SetCurrentDirectory메소드를 호출하여 대상으로 지정할 경로를 알려주면 됩니다.

 

Directory.SetCurrentDirectory(@"C:\");

'Programming > .NET' 카테고리의 다른 글

[C#] 형변환(캐스팅 - Casting)  (0) 2017.08.01
[C#] 이벤트(event)  (0) 2017.07.26
[C#] Directory 와 DirectoryInfo 클래스  (0) 2017.07.19
[Visual Studio] Immediate Window  (0) 2017.07.12
[ASP.NET] SQL Server 캐시 종속성  (0) 2017.07.04
[ASP.NET] PasswordRecovery  (0) 2017.06.27
0 0
Programming/.NET

직접 실행창(Immediate Window)은 Visual Studio의 Menu->Debug->immediate로 볼 수 있으며 이 창에서는 프로그램을 빌드하지 않고도 소스상 임의의 코드를 바로 실행할 수 있습니다.

 

아주간단하게는 쉽게 변수를 대입해 True/False 여부를 확인하거나

 

? 1 == 1
true

 

프로그램에 static메소드가 존재하는 경우

 

public static string hi()
{
    return "Hello";
}

 

해당 메소드를 바로 실행해 볼 수 있습니다.

 

? Form1.hi()
"Hello"

 

실행은 ?로 시작하며 예제로 작업한 hi() 메소드는 Form1 클래스 하위에 속해있다고 가정합니다. 실행하고자 하는 메소드가 static이 아니면 객체를 생성하는 방법으로 실행할 수 있습니다.

 

? new Form1().hi()

 

물론 매개변수가 필요한 경우라도

 

public static int cal(int i, int j)
{
    return i + j;
}

 

그대로 실행이 가능합니다.

 

? Form1.cal(100, 200);
300

 

참고로 Immediate Window에서 > 문자를 입력하면 명령창의 기능을 활용할 수 있습니다.

'Programming > .NET' 카테고리의 다른 글

[C#] 이벤트(event)  (0) 2017.07.26
[C#] Directory 와 DirectoryInfo 클래스  (0) 2017.07.19
[Visual Studio] Immediate Window  (0) 2017.07.12
[ASP.NET] SQL Server 캐시 종속성  (0) 2017.07.04
[ASP.NET] PasswordRecovery  (0) 2017.06.27
[ASP.NET] WindowsIdentity  (0) 2017.06.21
0 0
Programming/.NET

캐시 종속성은 참조중인 특정 개체가 변경이 발생될 경우 해당 캐시를 무효화하는걸 의미합니다. 일반적인 캐시사용시 무효화방법은 아래 글에서 이미 알아보았습니다.

 

2016/04/18 - [Programming/ASP.NET] - [ASP.NET] 캐시 - 2

 

이번에는 SQL Server의 특정 테이블에 대한 종속성을 알아보고자 합니다. 우선 SQL Server에 종속성을 설정하려면 DB와 해당 DB에 존재하는 Table을 상대로 기능을 활성화해야 합니다. 기능 활성화를 위해서는 C:\Windows\Microsoft.NET\Framework\v4.0xxx 경로에 aspnet_regsql.exe 유틸을 사용합니다.

 

aspnet_regsql.exe -S localhost -U sa -P 12345 -d aspnetdb -ed

 

위 명령은 localhost에 존재하는 SQL Server의 aspnetdb 데이터베이스에 캐시 종속성이 사용가능하도록 설정하는 명령입니다. 맨 끝의 -ed옵션이 기능활성화에 대한 옵션입니다. 반대로 -dd를 지정하면 기능을 끄도록 합니다.

 

aspnet_regsql.exe -S localhost -U sa -P 12345 -d aspnetdb -t aspnet_Users -et

 

aspnetdb에 캐시 종속성 기능을 활성화 하고 나서 해당 DB에 있는 aspnet_Users테이블에 대한 종속성기능을 부여하였습니다. -t 옵션으로 테이블을 지정하고 -et로 기능을 사용하도록 합니다. -et의 반대는 -dt이며 기능을 끄도록 합니다.

 

위와 같이 캐시종속성을 설정한 후 웹애플리케이션의 Web.config에서 SQL Server에 대한 연결정보를 추가하고

 

<connectionStrings>
  <add name="SQLSeverConnect" connectionString="Data Source=localhost;User 

ID=sa;Password=12345;Database=aspnetdb;Persist Security Info=False"/>
</connectionStrings>

 

cahing 요소로 캐시 무효화를 설정합니다.

 

<caching>
  <sqlCacheDependency enabled="true">
    <databases>
      <add name="aspnetdb" connectionStringName="SQLSeverConnect"/>
    </databases>
  </sqlCacheDependency>
</caching>

 

참고로 위 설정은 system.web 하위에 들어가야 합니다.

 

이것으로 애플리케이션 설정은 완료되었습니다. 이제 캐시활용이 필요한 페이지에서 종속성을 걸어놓을 테이블을 OutputCache지시자를 통해 지정합니다.

 

<%@ OutputCache Duration="60" VaryByParam="none" SqlDependency="aspnetdb:aspnet_Users" %>

 

OutputCache지시자의 Duration에 따라서 60초간 페이지가 캐시될 것입니다. 하지만 aspnet_Users테이블에 변경사항이 발생하면 Duration설정과는 관련없이 캐시가 무효화될것입니다.

 

참고로 위 설정들이 제대로 동작하는지 확인하려면 페이지를 호출한 뒤에 지정한 테이블의 데이터를 무작위로 하나만 바꾸어 줍니다. 그리고 다시 페이지를 호출하면 되는데 페이지를 호출할때 Ctrl + F5키를 눌러서 새로고침 해주시면 됩니다.

 

만일 종속성을 설정해야할 테이블이 2개 이상이라면 SqlDependency속성에서 ;문자로 구분해서 대상 테이블을 설정합니다.

 

<%@ OutputCache Duration="60" VaryByParam="none"

 SqlDependency="aspnetdb:aspnet_Users;aspnetdb:tmp_table" %>

 

위에 안내해드린 '캐시 - 2'글에서 잠깐 SqlCacheDependency 클래스를 사용했었습니다. 테이블 종속성은 캐시객체를 통해서도 저장할 수 있습니다.

 

SqlCacheDependency scd = new SqlCacheDependency("aspnetdb", "aspnet_Users");
Cache.Insert("aspnetuser", MyObject, scd);

'Programming > .NET' 카테고리의 다른 글

[C#] Directory 와 DirectoryInfo 클래스  (0) 2017.07.19
[Visual Studio] Immediate Window  (0) 2017.07.12
[ASP.NET] SQL Server 캐시 종속성  (0) 2017.07.04
[ASP.NET] PasswordRecovery  (0) 2017.06.27
[ASP.NET] WindowsIdentity  (0) 2017.06.21
[ASP.NET] 웹파트(WebParts)  (0) 2017.06.13
0 0
1
블로그 이미지

클리엘