2012-07-06 4 views
3

긴 작업을 수행하는 함수가 있으며 때때로 상태 업데이트로 다른 곳에서 변수를 업데이트하려고합니다. (이렇게하는 더 좋은 방법이 있다면 괜찮습니다.) 라이브러리를 작성 중이며이 코드를 여러 번 호출하여 변수를 저장하는 동일한 클래스에 다른 변수를 만드는 것이 옵션이 아닙니다. 여기처럼 내 코드가 보일 수 있습니다 것입니다 : 당신은값 대신 변수에 대한 참조 보내기

int Progress = 0; 
public static bool Count(ref int Progress, int CountToWhat) 
{ 
    .... 
} 

또는

int Progress; //without init 
public static bool Count(out int Progress, int CountToWhat) 
{ 
    .... 
} 
+1

이 기능을 사용하지 않는 것으로 생각하십니까? 그런 다음 클래스에서 변수를 유지할 수 있습니다. – JamieSee

답변

3

변경을 사용할 수 있습니다

public static bool Count(int Progress, int CountToWhat) { 
    for (int i = 0; i < CountToWhat; i++) { 
     Progress = CountToWhat/i; // This is how I'd like to update the value, but obviously this is wrong 
     Console.WriteLine(i.ToString()); 
    } 
} 
+0

감사합니다. 이것은 가장 간단한 해결책이었습니다. – Oztaco

2

서명에 :

public static bool Count(ref int Progress, int CountToWhat) 

그리고 때 호출 그것, variabl 전에 ref 키워드를 사용하여 그 첫 번째 인수로 전달합니다.

+0

* "참조는 원시 타입이 아닌 클래스에서 사용됩니다."* 무엇을 의미합니까? 또한 out/ref를 사용할 수도 있지만 이것이 유일한 방법은 아닙니다. – Servy

+0

Class1을 매개 변수로 사용하여이 메서드를 테스트하면 public void Test (Class1 value) {...}; ref 또는 out으로 키워드를 추가 할 필요가 없습니다. –

+0

특정 상황에서 클래스에 대해 ref/out을 사용하는 것이 여전히 목적입니다. 어쨌든, 요점은 그것이 잘못 쓰여지고 현재 쓰여지고있는 것처럼 이해할 수 없다는 것입니다. – Servy

4

이것은 발신자에게 업데이트를 제공하는 좋은 방법이 아닙니다.

클래스 라이브러리에 하나 이상의 이벤트 (예 : OnError, OnProgress 등)를 정의하는 것이 좋습니다. 특정 조작의 진행 상황을 통지 할 때, OnProgress 예를 들어 올릴 수 : 작업자 스레드에서 통지 특히

for (int i = 0; i < CountToWhat; i++) { 
    OnProgress(CountToWhat/i); 
    Console.WriteLine(i.ToString()); 
} 

이것은, 그것을하는 더 나은 방법입니다. 진행 상황을보고하기 위해 호출 할

+3

정적 이벤트 처리기가 특정 사례에 대해별로 이해하지 못하는 경우 메소드가 대신 콜백을 수행하도록 할 수 있습니다. 'public static bool Count (int 진행, int CountToWhat, 액션 OnProgress)'. 그런 식으로 정적 대신 로컬 스코프를 사용합니다. –

+0

@TimS : 물론 콜백은 비 정적 상황에서도 항상 좋은 대안입니다. –

+1

그들이 작동하기 때문에 "ref"응답을 +1했지만이 결과를 얻으려면 ** 선호 ** 방법이 있습니다. – Nate

1

더 좋은 방법은 Action<int> 대리자를 통과 할 수 있습니다

Count(100, p => currentProgress = p); 

당신은 또한 BackgroundWorker 클래스를 사용할 수 있습니다

public static bool Count(int CountToWhat, Action<int> reportProgress) 
{ 
    for (int i = 0; i < CountToWhat; i++) 
    { 
     var progress = CountToWhat/i; 
     reportProgress(progress); 
     Console.WriteLine(i.ToString()); 
    } 
} 

는 당신이 그것을 좋아 사용하십시오 장기 실행 작업을 실행하고 ProgressChanged 이벤트를 활용하십시오.

관련 문제