2014-01-11 5 views
2

WPF MediaKit (MediaDetector class) 라이브러리를 사용하여 GIF 변환기로 비디오를 만들어 시간별로 비디오를 추출하려고합니다. async/await를 사용하여 StartButton_OnClick 메서드를 비동기 적으로 실행하고 싶습니다.C#에서 비동기 호출 메서드

나는 다음과 같은 코드를 사용하고 있습니다 :

private async void StartButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    if (_openFile != null && 
     !String.IsNullOrEmpty(SaveToBox.Text)) 
    { 
     await new LocalVideoConverter(_openFile.FileName, _from*1000, _to*1000, 
      SaveToBox.Text, InterpolationMode.Low, new System.Drawing.Size(320, 240)) 
      .StartConverting(); 
    } 
    else 
     MessageBox.Show("Choose video file and enter path for Gif"); 
} 

StartConverting() 방법 :

public override Task StartConverting() 
{ 
    return Task.Run(() => 
    { 
     Encoder.Start(GifPath); 
     Encoder.SetDelay(Ival); 
     Encoder.SetRepeat(0); 
     for (double i = From; i < To; i += Ival) 
     { 
      var frame = GetFrame(TimeSpan.FromMilliseconds(i)); 
      frame = ResizeImage(frame); 
      AddFrame(frame); 
     } 
     Encoder.Finish(); 
    }); 
} 

GetFrame(TimeSpan ts) 방법 :

또한
protected override Image GetFrame(TimeSpan ts) 
{ 
    var bitmapSource = _mediaDetector.GetImage(ts); 
    using (var outStream = new MemoryStream()) 
    { 
     BitmapEncoder enc = new BmpBitmapEncoder(); 
     enc.Frames.Add(BitmapFrame.Create(bitmapSource)); 
     enc.Save(outStream); 
     return new Bitmap(outStream); 
    } 
} 

MediaDetector 클래스 public unsafe BitmapSource GetImage(TimeSpan position) 방법이있다.


나는 StartButton을 클릭하면, 내가 메시지 과 System.InvalidOperationException를 얻을 수는 "다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다"GetImage() 방법 (look this)

이 줄을
if (string.IsNullOrEmpty(m_filename)) 

나는 멀티 스레드 프로그래밍의 초보자입니다. 이 문제를 어떻게 해결할 수 있습니까?

P. 내 영어가 좋지 않아서 미안 해요 :-)

+1

[Dispatcher.VerifyAccess] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.verifyaccess.aspx)는 예외가 단지 한 줄 전에 나오는지 확실히 확인하십시오. 라는. 메서드 호출이 현재 스레드에서 허용되는지 여부를 확인합니다. 여기서는 분명하지 않습니다. Dispatcher 스레드에서 GetImage 메서드를 동 기적으로 실행하여 즉, [Dispatcher.Invoke] (http://msdn.microsoft.com/en-us/library/system.windows.threading)로 전달하여 이러한 제한을 극복 할 수 있습니다. dispatcher.invoke.aspx) 호출. – Clemens

답변

2

을 사용하여 async/await 번으로 돌아갈 수도 있습니다. 이 WPF 이후, 난 당신이 내가 추천하지 않는 게 좋을 있지만

private void StartButton_OnClick(object sender, RoutedEventArgs e) { 
    if (_openFile != null && !String.IsNullOrEmpty(SaveToBox.Text)) { 
     this.Dispatcher.BeginInvoke(new Action(delegate() { 
      LocalVideoConverter lvc = new LocalVideoConverter(_openFile.FileName, _from*1000, _to*1000, 
      SaveToBox.Text, InterpolationMode.Low, new System.Drawing.Size(320, 240)); 
      lvc.StartConverting(); 
     })); 
    } else 
     MessageBox.Show("Choose video file and enter path for Gif"); 
} 

BackgroundWorker

이뿐만 아니라 수도있을 쓸 수있는 것 같아요.