2014-12-12 3 views
2

이 메서드에 전달하는 매개 변수를 기반으로 계산을 수행하는 장기 실행 비동기 메서드가 있습니다.장기 실행 가능 작업의 매개 변수 변경

는이 같은 비트 보이는

: 기본적으로이 방법은 내 UI에서라고

public async Task<Measurement> StartMeasurementAsync(
           int duration, 
           int nbr, 
           double parameter, 
           IProgress<IntermediateResults> progress, 
           CancellationToken cancellationToken) 
{ 
    Measurement measurement = new Measurement { Parameter = parameter }; 

    for(int i = 0; i < nbr; i++) 
    { 
     var rawData = await RunMeasurement(duration, progress, cancellationToken); 

     var treatedData = DataTreatment.Treat(rawData, parameter); 
     measurement.Data.Add(treatedData); 

     cancellationToken.ThrowIfCancellationRequested(); 
    } 

    return measurement; 
} 

, 나는 사용자가 변경할 수있는 내 원시 데이터를 시각적으로 표현을 새로 진행을 사용하고 있습니다 매개 변수. 이 매개 변수는 메서드에서 전달 된 매개 변수와 같습니다.

for 루프에서 기다린 후에 호출되는 데이터 처리는 UI에서 호출되기 때문에 사용자는이 매개 변수가 원시 데이터에서 변경 한 결과를 "실시간"으로 볼 수 있습니다. 그런데 매개 변수가 변경되었다는 것을 장기 실행 작업에 알려야하므로 올바르게 Measurement에 저장됩니다.

내가 막힌 곳에서 어떻게이 매개 변수가 변경되었다는 것을 알 수 있습니까?

+0

글자 그대로 묻는 것을 해석하면 'ref' 매개 변수를 전달할 수 있지만 다른 스레드의 ref 매개 변수를 변경하면 데이터 손상을 묻는 중입니다. 난 그냥 기존의 작업을 취소하고 새로운 매개 변수를 사용하여 새로운 하나를 시작한다고 생각합니다. –

+0

async 메서드를 호출하여 매개 변수를 기반으로 계산을 수행하고 해당 매개 변수가 계산 중에 변경 될 수있는 경우 계산을 다시 시작하지 않아야합니까? – ericpap

+1

@BenRobinson AFAIK 당신은'async' 메소드로'ref'를 사용하여 시작할 수 없습니다. –

답변

3

이것은 비동기식으로 웹 페이지를 다운로드하는 것과 비교하여 HttpClient을 사용한다고 말할 수 있습니다.

일부 웹 요청을 시작했다고 가정 해 보겠습니다. 잠시 후에 어떤 이유로 사용자가 요청한 페이지에 관심이없고 다른 페이지에 관심이있는 경우 일반적으로 요청을 취소하고 새 요청을 시작합니다.

너는 말할 수 없다. 안녕하세요, 저는 작전이 시작되고 반쯤 진행된 후 새 페이지에 관심이 있습니다. 취소하고 새 것을 시작해야합니다.

동일한 논리가 여기에 적용됩니다. 비동기 작업을 취소하고 새 작업을 시작해야합니다. 장기간에 걸친 방법으로 이미 취소를 지원하신 것 같습니다. 그래서 나는 이전 작업을 취소하고 새 작업을 시작하는 것이 큰 문제가 아닐 것이라고 생각합니다.

또는 가변 개체를 매개 변수로 StartMeasurementAsync에 전달하고 적절한 동기화를 통해 변경해야 할 때 변경할 수 있습니다. 그런 다음 변경 사항을 폴링하거나 일종의 변경 알림 (예 : INotifyPropertyChanged)을 구현하고 비동기 메소드에서 적절하게 작동합니다.

IMO 첫 번째 방법은 더 깨끗합니다. 투표를 취소하고 다시 시작하십시오.

+0

불행히도, 나는 작업을 취소 할 수 없습니다. 사용자가 작업을 취소하더라도 중간 결과를 저장하고 유지해야합니다. 이 매개 변수를 변경해도 웹 요청의 URI를 변경하면 전체 논리가 변경되지 않습니다. 이는 일부 계산에 사용되는 사소한 매개 변수 일뿐입니다. – Gimly

+0

내 대답에 설명 된 대체 방법이 도움이됩니까? 또는..? 귀하의 코드가 무엇인지, 그리고 전달 된 매개 변수에 따라 어떻게 달라지는 지 확신 할 수 없습니다.그래서 코드 도움말을 제공 할 수 없습니다 : ( –

+0

나는 가변 객체를 전달하려고 시도했지만 일부 동시성 문제가 발생하는 것 같습니다. "적절한 동기화"에 대한 단서를 줄 수 있습니까? – Gimly