기존의 Class에 추가로 함수를 추가 하는경우 사용한다.

확장 메소드의 Class는 Static으로 정의 되어야 하며 첫번째 파마메터에 this 기존클래스명 이 들어가야 한다.


public static class StringExtention

{

    public static int ToInt(this string str)

    {

        int result = 0;

        try

        {

            result = int.Parse(str);

        }

        catch

        {

        }

        return result;

    }

}



확장 메소드 등록 시 아래처럼 상용이 가능하다.


Posted by 홍상길 홍상길

1. #if  #endif 사용하기

#if DEBUG 
    // 코드 입력 

#endif

 

2. Sytem.Diagnostics Namespace 사용하기

if (Debugger.IsAttached)
{ 
    // 코드 입력

 }

 

Posted by 홍상길 홍상길

 

 

[System.Net을 이용하여 알아보기]

bool networkUp
   
= System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

 

또는

 

NetworkInterface[] networkCards
   
= System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

 

[IP를 이용하여 알아보기]

IPEndPoint ipep =  new IPEndPoint(Ipaddress.Parse("IP TO CHECK"), YOUR_PORT_INTEGER);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server
.Connect(ipep);

 

[Ping 테스트로 알아보기]

Ping netMon = new Ping();
PingResponse response = netMon.PingHost(hostname, 4);
if (response != null)
{
   
ProcessResponse(response);
}

 

Posted by 홍상길 홍상길

 

StreamReader reader = new StreamReader( testStream );
string text = reader.ReadToEnd(); 
Posted by 홍상길 홍상길

 

 

byte[] byteArray = Encoding.ASCII.GetBytes("teststring");
MemoryStream stream = new MemoryStream( byteArray );
Posted by 홍상길 홍상길

C#에서 Excel에서 Microsoft.Office.Interop.Excel namespace를 이용해 파일을 저장할 때 기본 파일로 저장을 하게 되면

Cell 너비나 높이, 폰트 사이즈 등을 개별적으로 설정하기가 힘듭니다.

엑셀 템플릿을 불러와서 템플릿 파일을 이용해 Cell 스타일을 입혀서 저장 하는 방식입니다.

 

아래 소스는 엑셀 저장 소스 중 템플릿을 가져오는 예제 소스 입니다.

….

….

Excel.Application oXL = null;
Excel._Workbook oWB = null;

Excel._Worksheet oSheet = null;

 

oXL = new Excel.Application();

string path = @"C:\Templates\TemplateTest.xlt";

oWB = oXL.Workbooks.Open(path, 0, false, 5, "", "",

false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

 

oSheet = (Excel._Worksheet)oWB.ActiveSheet;

oSheet.Cells[2, 2] = "Text";

….

….

Posted by 홍상길 홍상길

using System.Net.Mail;

MailAddress from = new MailAddress("[보내는사람 이메일 주소]", "[이름]");
MailAddress to = new MailAddress("[받는사람 이메일 주소]", "[이름]");
MailMessage message = new MailMessage(from, to);

message.Subject = "[ 이메일 제목 ]";
message.IsBodyHtml = true;  // Html 형식으로 보냄설정.
message.Body = "[이메일 내용]";

SmtpClient smtp = new SmtpClient("[메일서버]");

smtp.UseDefaultCredentials = false; // 시스템에 설정된 인증 정보를 사용하지 않는다.
smtp.EnableSsl = false;  // SSL을 사용한다.
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new System.Net.NetworkCredential("[이메일서버 아이디]", "[이메일서버 패스워드]");
Posted by 홍상길 홍상길

2010.06.21 09:55 Programming/C#

Invoke


http://blog.naver.com/ljh0707/10036599823
Posted by 홍상길 홍상길

http://kimgwajang.tistory.com/193
Posted by 홍상길 홍상길

출처 : http://uzys.tistory.com/438

Invoke, MethodInvoker, BeginInvoke - EndInvoke

 

  UI Control들은 폼 구동시 실행되는 하나의 쓰레드에서 구동된다. 따라서 사용자가 실행시킨 쓰레드는 별도로 실행 되기 때문에 이 메인 쓰레드에 적절한 마샬링 없이 다른쓰레드에서 직접 접근하면 다른 쓰레드를 침범하는 것이다. (Cross Thread Problem) 이런 경우에는 프로그램이 개발자가 설계한대로 잘 동작하지 않을 수 있다.(Race Condition,DeadLock)  따라서, 안전하게 동작하게 하기위하여 .Net 환경에서는 Invoke를 제공하고 있다.

 본 내용을 무시한 채 프로그램을 작성하면 InvalidOperationException을 발생시키고 . Debug 창에서 "컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다."라는 메세지가 표시 된다. 하지만 디버깅 환경이 아니라면 프로그램은 겉보기에 정상 동작하는 것 처럼 보일 수 있으므로 조심해야 된다. !

 

난 대충 좀 안되도 상관 없다고 생각하시는 분들은 이 예외를 비활성화 할 수도 있습니다.

 

CheckForIllegalCrossThreadCalls 속성 값을 false로 설정하여 이 예외를 비활성화할 수 있습니다. 그러면 컨트롤이 Visual Studio 2003에서와 같은 방식으로 실행됩니다.

 

 자 그럼 쓰레드에서 안전하게 Windows Form control을 제어하게 하는 방법에 대해 알아보자

 

InvokerRequired  속성은 Invoke메쏘드를 호출해야되는지 알려준다.

 

Invoke

 

 쓰레드에서 폼 컨트롤 하기 위해서는 별도의(SetTextononTextBox1) 메쏘드를 만들어 사용하면 좋다. 예를들어, Textbox에 값을 입력한다면 아래와 같은 'SetTextonTextBox1' 메쏘드를 만들어서 사용하면 Cross thread 환경이든 내부 쓰레드 사용환경에서든 둘다 사용할 수 있다.

 Invoke를 사용할 때 인자를 넘겨줘야 하는 메쏘드 필요하면 할때는 반드시 delegate를 선언한 후에 사용하여야 한다.

 

  1.         delegate void SetTextCallback(string txt);                    
            private void SetTextonTextBox1(string txt)
            {
                if (this.textBox1.InvokeRequired)
                {
                    this.Invoke(new SetTextCallback(SetTxtCB), new object[] { txt }); //그냥 txt를 넘겨줘도 된다
                }
                else
                {
                    this.textBox1.Text += txt;
                }
            }
            private void SetTxtCB(string txt)
            {
                this.textBox1.Text+=txt;
            }

 

인자가 없는 메쏘드를 호출할 때는 간단하게 MethodInvoker를 사용하면 좋다.

 

  1.         private void SetTextonTextBox1(string txt)
            {
                if (this.textBox1.InvokeRequired)
                {
  2.                this.Invoke(new MethodInvoker( delegate { this.textBox1.Text+=txt; }) );

                }
                else
                {
                    this.textBox1.Text += txt;
                }
            }

 

BeginInvoke , EndInvoke

 

 우선 BeginInvoke를 설명하기 전에 Windows Form 의 Control.BeginInvoke 메쏘드와 Delegate.BeginInvoke 메쏘드에 대해서 차이점을 설명하고 본 단락에서는 Winfows Form Control의 BeginInvoke만 설명하도록 하겠다.

 Delegate.BeginInvoke는 Asynchronous Delegate를 만들어서 콜백을 하는 것이라고 생각하면 되겠다. 다시말해서, CLR에서 관리하는 쓰레드풀에서 해당 메쏘드를 큐잉한다. 쉽게 얘기해서 별도의 쓰레드를 만들어서 Delegate를 실행한다고 보면 된다.  장점은 IAsyncResult를 이용해서 Object 결과값을 넘겨 받을 수 있다. 보다 자세한 사항은 이곳을 참조!

  Windows Form의 Control.BeginInvoke는 Control 내부 핸들이 작성된 쓰레드(메인쓰레드)에서 지정된 대리자를 비동기식으로 실행한다. 비동기식이므로 실행을 대기하지 않고 BeginInvoke는 즉시 Return 한다.

 차이점을 정리 하자면 Control.BeginInvoke는 실행코드의 GUI Thread에 작성된 코드이고 Delegate.BeginInvoke는 쓰레드풀 쓰레드에 사용된다. 또한 Control.BeginInvoke의 경우는 EndInvoke를 호출하지 않아도 되나 Delegate.BeginInvoke의 경우는 반드시 Delegate.EndInvoke를 호출해줘야 한다 안그러면 메모리 릭이 발생한다.

 

 

  1. public delegate void InvokeDelegate();
  2. private void Invoke_Click(object sender, EventArgs e)
    {
       myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
    }
    public void InvokeMethod()
    {
       myTextBox.Text = "Executed the given delegate";
    }
  3.  

 

 Endinvoke

 References
  1. http://msdn.microsoft.com/ko-kr/library/ms171728.aspx
  2. http://xmlangel.textcube.com/6
  3. http://jongkok4.net/entry/펌c-UI-쓰레드-마샬링-Invoke-BeginInvoke?TSSESSIONjongkok4net=6e5ec00b34c31e0126e9a64412f7a627
  4. http://timl.net/2008/01/begininvoke-methodinvoker-and-anonymous.html
  5. http://shiman.wordpress.com/2008/09/10/c-net-delegates-asynchronous-invocation-begininvoke-method/
  6. http://msdn.microsoft.com/ko-kr/library/0b1bf3y3(VS.80).aspx
  7. http://kristofverbiest.blogspot.com/2007/02/don-confuse-controlbegininvoke-with.html
  8. http://www.albahari.com/threading/#_Introduction
  9. http://www.yoda.arachsys.com/csharp/threadstart.html 
Posted by 홍상길 홍상길
이전버튼 1 이전버튼

블로그 이미지
홍상길

공지사항

Yesterday28
Today30
Total291,201

달력

 « |  » 2019.5
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 달린 댓글

글 보관함