Remoting 프로그램이나 다른 애플리케이션을 작성할 때 필연적으로 스레드를 처리해야 합니다. .Net을 사용하면 스레드를 쉽게 생성할 수 있지만 스레드 생성 및 스레드 시작을 위해 제공하는 메서드는 명확한 매개 변수를 제공하지 않습니다. 스레드를 사용하여 클래스의 매개변수가 있는 메소드를 시작하려면 어떻게 해야 합니까? 다음은 이 기능을 구현하기 위해 .NET에서 제공하는 풍부한 프레임워크를 사용하는 방법에 대한 간략한 소개입니다. 전체 프로세스를 생생하게 소개하기 위해 스레드 시작 방법의 전달자이기도 한 다음과 같은 .NET 클래스를 만들었습니다. 클래스는 다음과 같습니다:
using System;
네임스페이스 WindowsApplication1
{
/// <summary>
/// UrlFetcher에 대한 요약 설명
/// </summary>
public class MyClass{
// 메소드 1의 경우
private string _parameter;
public MyClass(string 매개변수){
this._parameter = 매개변수
}
public void MyMethod1(){
if(this._parameter!=null){
// 작업 수행
Console.Write(this._parameter )
}
}
// 메소드 2의 경우
public MyClass(){}
// 이 메소드는 비공개이지만 공개 또는 기타
비공개일 수 있습니다. void MyMethod2(string 매개변수){
// 무언가를 수행합니다.
Console.Write(parameter)
}
// WaitCallback을 위임하기 때문에
;매개변수 유형은 객체입니다
. // 문자열로 변환하겠습니다.
public void MyMethod2(object parameter){
this.MyMethod2((string)parameter)
;
// 메소드 3의 경우
public string MyMethod3(string 매개변수){
return "매개변수 값은 다음과 같습니다."+parameter
}
// 전달된 다중 매개변수의 경우
public string MyMutilParameters(string param1,string param2){
return "매개변수 1과 매개변수 2의 연결 결과는 다음과 같습니다. "+param1+param2
}
}
}
헤헤, 제 영어 실력이 좋지 않습니다. 댓글이 영어로 되어 있기 때문에 서투른 점 양해해 주시기 바랍니다. 위 수업에 담긴 내용에 대해 간략하게 이야기를 해볼 필요가 있을 것 같습니다. 첫째, 두 개의 생성자를 포함합니다. 하나는 매개변수가 있고 다른 하나는 매개변수가 없습니다(의도적으로 배열됨). 클래스에 있는 다른 메소드들의 이름을 통해 짐작하시리라 생각됩니다. 매개변수를 전달하는 메소드 3가지를 소개한 후, 하나씩 소개하겠습니다. 먼저 스레드를 시작하는 방법을 살펴보겠습니다. 먼저 함수를 사용하여 ThreadStart 대리자의 인스턴스를 인스턴스화한 다음 이 인스턴스를 새 스레드(Thread) 개체로 사용하고 마지막으로 스레드를 시작하려고 합니다. 자세한 내용은 MSDN 설명서의 스레드 섹션을 참조하세요.
결과를 테스트하기 위해 Form과 4개의 버튼이 있는 WinForm 프로젝트를 만들었습니다. 모든 소스 코드가 필요한 경우 [email protected] 으로 이메일을 보내주세요. . 다음은 각 방법에 대한 자세한 설명입니다.
1. 생성자를 사용하여 매개변수를 전달합니다
. 우리 모두 알고 있듯이 매개변수가 있는 생성자를 사용하여 객체를 생성할 수 있습니다. 이 경우 생성자를 사용하여 먼저 사용할 매개변수 값을 전달할 수 있습니다. 객체의 내부 변수를 사용하고 매개변수 없는 생성자를 사용하여 이 매개변수를 사용합니다(매개변수인 척). 간단히 말하면 함수에 필요한 매개변수를 저장하기 위해 구체적으로 클래스에 변수를 선언하면 함수는 매개변수 없는 형태가 된다. 이 방법의 가장 큰 문제점은 캡슐화를 파괴한다는 것입니다. 이러한 변수에 직접 액세스할 수는 없지만 숨겨진 위험은 항상 존재합니다(또는 불쾌해 보이더라도 상관없습니다). 다음 코드 조각은 이 메서드를 사용하여 매개 변수를 전달하는 방법에 대한 세부 정보를 제공합니다. 이는 위에서 언급한 네 개의 버튼(Button1) 중 하나에 대한 클릭 코드이기도 합니다. 전달할 매개변수를 갖기 위해 WinForm에서 전역적으로 다음과 같이 변수를 정의했습니다.
// 이것은 매개변수의 값입니다.
private string myParameter = "ParameterValuen"
버튼 이벤트는 다음과 같습니다.
// 매개변수를 구성하여 스레드에 전달했습니다
. void Button1_Click( object sender, System.EventArgs e) {
MyClass 인스턴스 = new MyClass(myParameter);
new Thread (new ThreadStart(instance.MyMethod1)).Start()
}
위에서 언급한 것처럼 생성자를 사용하여 매개변수를 전달합니다. Go 클래스를 사용하고 위에서 언급한 방법을 사용하여 스레드를 시작하면 프로그램 실행 후 출력 창에서 MyMethod1의 실행 결과를 볼 수 있습니다(TextBox 등을 사용하여 WinForm에 직접 표시할 수도 있습니다). 매개변수값. 함수 본문을 보면 결과가 올바른 것을 알 수 있습니다. 매우 간단하지 않습니까?
2. ThreadPool을 사용하여 매개변수 전송을 실현합니다.
먼저 MSDN이 ThreadPool을 어떻게 설명하는지 살펴보겠습니다. 작업 항목 게시, 비동기 I/O 처리, 다른 스레드 대신 대기 및 타이머 처리에 사용할 수 있는 스레드 풀을 제공합니다. QueueUserWorkItem이라는 메서드 컬렉션을 확인하세요. 이 클래스와 이 메서드에 대한 자세한 내용은 MSDN 관련 도움말을 참조하세요. 여기서 주목해야 할 것은 QueueUserWorkItem 메소드의 매개변수입니다. WaitCallback 매개변수는 위임자 유형입니다. 두 번째 매개변수는 위임 인스턴스(함수, 즉 함수로 인스턴스화한 후)에 필요한 매개변수입니다. 객체 유형의. 자세한 내용은 아래 코드를 참조하세요.
// ThreadPool에 의해 스레드에매개
변수 전달됨
private void 버튼2_Click(object sender, System.EventArgs e) {
MyClass 인스턴스 = new MyClass();
ThreadPool.QueueUserWorkItem (new WaitCallback (instance.MyMethod2),myParameter)
}
of QueueUserWorkItem 매개 변수는 개체 유형이므로 메서드의 매개 변수를 충족하려면 MyClass에서 크기가 조정된 두 가지 버전의 MyMethod2를 정의해야 합니다. 마찬가지로 myParameter 매개변수를 전달하고 프로그램을 실행했습니다. Button2를 클릭하면 MyMethod2가 매개변수로 myParameter를 실행한 결과가 출력 창에 나타납니다.
3. 다음은 비동기식 위임을 사용하여 매개변수 전송을 구현하는 마지막 방법입니다
. 마찬가지로 위임에 대한 자세한 내용은 위에 자세히 설명된 MSDN을 참조하세요. 여기서는 BeginInvoke 및 EndInvoke 메서드를 사용하겠습니다. 먼저 다음과 같이 매개변수를 전달하는 방법을 제공합니다.
// 비동기 대리자에 의해 전달된 매개변수
string MyMethod3Delegate(string 매개변수);
private void 버튼3_Click(object sender, System.EventArgs e) {
MyClass 인스턴스 = newMyMethod3Delegate
;
myMethod3 = new MyMethod3Delegate(instance.MyMethod3);
myMethod3.BeginInvoke("parameterValue",new AsyncCallback(AfterMyMothod3),null)
}
public void AfterMyMothod3(IAsyncResult result){
AsyncResult async = (AsyncResult) result
; async.AsyncDelegate;
Console.WriteLine ("함수 호출 반환 값: {0}n", DelegateInstance.EndInvoke(result))
}
먼저 대리자를 사용하기 위해 매개변수를 지정하는 MyMethod3Delegate 대리자를 선언합니다. 및 반환 값 문자열인 함수가 적합하므로 MyClass에 MyMethod3 메서드를 정의합니다. 이 함수의 구조는 위의 대리자를 따르므로 Button3을 클릭할 때 이 메서드를 사용하여 대리자를 인스턴스화한 다음 이 메서드를 비동기적으로 호출하여 반환 결과를 표시할 수 있습니다. 함수 실행 결과. 프로그램을 실행하고 Button3을 클릭하여 출력의 결과 출력이 매개변수를 사용한 MyMethod3 실행 결과인지 확인합니다. 마지막으로 여러 매개변수를 전달하는 방법에 대한 방법을 제공합니다. 제 예는 매개변수 2개를 전달하는 것입니다. 코드는 다음과 같습니다:
// mutil 매개변수 전달됨
위임자 string MyMutilParamsDelegate(string 매개변수1,string 매개변수2);
private void 버튼4_Click(object sender, System.EventArgs e) {
MyClass 인스턴스 = new MyMutilParamsDelegate
mutilParams = new MyMutilParamsDelegate( 인스턴스.MyMutilParameters );
mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null)
}
public void AfterMutilParams(IAsyncResult result){
AsyncResult async = (AsyncResult) result;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;
Console.WriteLine ("다중 매개변수 함수 호출은 결과를 반환합니다: {0}n", DelegateInstance.EndInvoke( result ));
}
공간 제약으로 인해 코드에 대한 자세한 설명은 생략하겠습니다. 틀린 부분이 있으면 수정해주세요. 읽어주셔서 감사합니다! 연락처 정보: [email protected] CSDN 포럼 ID: cuike519
참고 문서: