[ONENOTE]

hsj0511·2019년 3월 13일
0

ONENOTE

목록 보기
1/1

windbg - 닷넷 응용 프로그램의 메모리 누수 분석

windbg - 닷넷 응용 프로그램의 메모리 누수 분석
[출처] windbg - 닷넷 응용 프로그램의 메모리 누수 분석|작성자 techshare

출처: http://blog.naver.com/PostView.nhn?blogId=techshare&logNo=221461195700&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postList

prompt 매크로

copy /Y "$(TargetDir)$(TargetName)." "$(SolutionDir)\02.Launcher\GSCM.Launcher\bin\Debug\$(TargetName)."

MSSQL MERGE

동적참조

C# task 중지 종료

실행중인 Task 중지법

      CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

           Task myTask = Task.Factory.StartNew(() =>
{
for(...)
{
token.ThrowIfCancellationRequested();

                    //Body of for loop.
}
}, token);

           // ... elsewhere ...
cts.Cancel();

출처: https://m.blog.naver.com/PostView.nhn?blogId=burin&logNo=40152498179&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


C# task 중지 종료

//task 시작
CancellationTokenSource cts = null; private void button6_Click(object sender, EventArgs e) { cts = new CancellationTokenSource(); CancellationToken token = cts.Token; myTask2 = Task.Run(() => { for (int i = 0; i < 10000; i++) { token.ThrowIfCancellationRequested(); Console.WriteLine("DoSomething : {0}", i); Thread.Sleep(30); } } , token); }

//task 중지
private void button4_Click(object sender, EventArgs e) { if (myTask2 != null && cts != null) { cts.Cancel(); } }

//task 상태확인
private void button5_Click(object sender, EventArgs e) { if (myTask2 != null && cts != null) { if (myTask2.IsCompleted) { MessageBox.Show("Complete"); } else { MessageBox.Show("ing"); } } }

참고: https://m.blog.naver.com/PostView.nhn?blogId=burin&logNo=40152498179&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

C# 실행중인 Task 중지법
실행중인 Task 중지법 CancellationTokenSource cts = new CancellationTokenSource(); Cancellati...
m.blog.naver.com
[출처] C# task 중지 종료|작성자 은기

출처: https://blog.naver.com/PostView.nhn?blogId=axlovelee&logNo=221408555241&from=search&redirect=Log&widgetTypeCall=true&topReferer=https%3A%2F%2Fsearch.naver.com%2Fsearch.naver%3Fsm%3Dtab_hty.top%26where%3Dpost%26query%3Dc%2523%2BTask.Run%26oquery%3Dabort%26tqi%3DUb51Usp0IWlsscbtVHossssssI8-361028&directAccess=false


Enum - 참조 관련 이슈

https://blog.naver.com/blog_-/221461015357


C# 리플렉션을 이용한 Delegate 넘기기

A.exe에서 B.dll을 컴파일시 참조하지 않고  동적으로 참조할 때,

B.dll에 있는 특정 클래스 메서드의 파라미터(Delegate)를 넘길때 방법입니다. 

리플렉션을 이용해서 대리자 개체를 생성 후 Invoke 파라미터에 넘겨주었습니다.

A.exe

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DelegateReflaction
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InvokeTest();
}

        private void InvokeTest()
{
string dllFilePath =@"D:\Work\Project\Test\DelegateReflaction\TestLibrary\bin\Debug\TestLibrary.dll";
Assembly assembly = Assembly.LoadFile(dllFilePath);

            Type formType = assembly.GetType("TestLibrary.ChiForm");

            //Child 델리게이트 타입 가져오기
Type deleType = assembly.GetTypes().Single(a => a.Name == "CallbackDelegate");

            //현재 클래스의 Callback 메서드 정보 가져오기
MethodInfo callBackMethodInfo = this.GetType().GetMethod("Callback", BindingFlags.NonPublic |BindingFlags.Instance, null, new Type[] { typeof(string) }, null);

            //Child의 CallbackDelegate Delegate를 이용해서 Deleagte 생성
Delegate callbackMethod = Delegate.CreateDelegate(deleType, this, callBackMethodInfo);

            //Child 폼 생성
Form form = Activator.CreateInstance(formType) as Form;

            //Child의 DoWork 메서드 가져오기
MethodInfo doworkMethodInfo = formType.GetMethod("DoWork");

            //파라미터 생성
object[] parameters = new object[2];
parameters[0] = "test~";
parameters[1] = callbackMethod;

            //Child Dowork 메서드 호출
doworkMethodInfo.Invoke(form, parameters);

            form.Show();
}

        void Callback(string msg)
{
MessageBox.Show(msg);
}
}
}

B.dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestLibrary
{
public class ChiForm : Form
{
public delegate void CallbackDelegate(string status);

        public ChiForm()
{
InitializeComponent();
}

        public void DoWork(string param, CallbackDelegate callback)
{
callback("status");
}

        private void InitializeComponent()
{
this.SuspendLayout();
//
// ChiForm
//
this.ClientSize = new System.Drawing.Size(284, 262);
this.Name = "ChiForm";
this.Text = "ChildForm";
this.ResumeLayout(false);

        }
}

출처: https://ehdrn.tistory.com/453 [동구의 블로그]

출처: https://ehdrn.tistory.com/453

0개의 댓글