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. 내 영어가 좋지 않아서 미안 해요 :-)
[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