Servus,
Erstmal der Code, dann die Fragen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83:
| using System; using System.Drawing; using System.IO; using System.Threading; using System.Threading.Tasks;
using AForge.Video.FFMPEG;
namespace VideoPlayer { public class Media { private object _sync = new object();
private CancellationTokenSource cts = null; private CancellationToken ct; private Task task = null;
private Bitmap _thumbnail; private MediaType _type; private string _uri;
public static int VideoThumbnailIndex = 15;
public event EventHandler<BitmapEventArgs> OnThumbnailChanged = null;
public Bitmap Thumbnail { get { lock (_sync) return _thumbnail; } set { lock (_sync) { _thumbnail = value; OnThumbnailChanged?.Invoke(this, new BitmapEventArgs(_thumbnail)); } } }
public MediaType Type { get; }
public string Uri { get => _uri; set { SetMediaType(value); _uri = value;
if (_type == MediaType.Video) StartReadingThumbnail(); } }
private void SetMediaType(string value) { if (!System.Uri.IsWellFormedUriString(value, UriKind.RelativeOrAbsolute)) throw new ArgumentException("Not well formated uri");
if (-1 != Array.IndexOf(new string[] { ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA" }, Path.GetExtension(value).ToUpper())) _type = MediaType.Audio; else if (-1 != Array.IndexOf(new string[] { ".AVI", ".MP4", ".DIVX", ".WMV" }, Path.GetExtension(value).ToUpper())) _type = MediaType.Video; else throw new NotSupportedException("Not supported file extension"); }
private void StartReadingThumbnail() { if (cts != null) { cts.Cancel(); task.Wait(); }
cts = new CancellationTokenSource(); ct = cts.Token;
task = Task.Factory.StartNew(() => { VideoFileReader reader = new VideoFileReader(); reader.Open(_uri);
for (int i = 1; i < VideoThumbnailIndex && !ct.IsCancellationRequested; i++) reader.ReadVideoFrame().Dispose();
Thumbnail = reader.ReadVideoFrame(); }, ct); } } } |
So zu meinen Fragen:
1. Ist der Zugriff auf die Thumbnail-Property sicher vor Multithreading-Exception?
2. Wird der EventHandler im Thread aufgerufen, in dem das Object der Klasse Media erstellt wurde oder im Task, der in der Methode StartReadingThumbnail erstellt wird?