[問題] 網路上代碼問題請益

看板C_Sharp (C#)作者 (無傷大雅)時間7年前 (2018/02/01 18:08), 7年前編輯推噓3(304)
留言7則, 4人參與, 7年前最新討論串1/1
小弟是C#新手,有小段從網上找到的代碼, 不過不太清楚是幹嘛的,找了一堆關於委派及事件的資訊, 也沒看過這樣的寫法,想請板友指導,謝謝。 mediaPlayer.EndReached += (sender, e) => { playFinished = true; }; -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.128.217 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1517479683.A.F41.html

02/01 20:21, 7年前 , 1F
你都知道是委派跟事件了 為什麼會看不懂?
02/01 20:21, 1F

02/01 20:25, 7年前 , 2F
就跟可視元件事件點兩下填入playFinished = true;一樣
02/01 20:25, 2F

02/01 20:37, 7年前 , 3F
lambda
02/01 20:37, 3F

02/02 00:18, 7年前 , 4F
訂閱事件的一種簡便寫法 如果不需要取消訂閱的話就能這
02/02 00:18, 4F

02/02 00:18, 7年前 , 5F
樣寫
02/02 00:18, 5F

02/02 00:21, 7年前 , 6F
缺點是sender,e在同一個域只能有一個
02/02 00:21, 6F

02/02 00:22, 7年前 , 7F
可以另改名稱: (a, b) => {...}
02/02 00:22, 7F
謝謝大家的回覆,只知道這看起來像callback function,但是沒這樣寫過。 不好意思,有個部份想再請教一下… 其實代碼主要是參考Vlc.Net,如下: --我是分隔線-- using System; using System.IO; using System.Threading; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string libDirectory; if (IntPtr.Size == 4) { // Use 32 bits library libDirectory = Path.Combine(Environment.CurrentDirectory, "libvlc_x86"); } else { // Use 64 bits library libDirectory = Path.Combine(Environment.CurrentDirectory, "libvlc_x64"); } var options = new string[] { // VLC options can be given here. Please refer to the VLC command line documentation. }; var mediaPlayer = new Vlc.DotNet.Core.VlcMediaPlayer(new DirectoryInfo(libDirectory)); var mediaOptions = new string[] { ":sout=#file{dst="+Path.Combine(Environment.CurrentDirectory, "output.mov")+"}", ":sout-keep" }; mediaPlayer.SetMedia(new Uri("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_h264.mov"), mediaOptions); bool playFinished = false; mediaPlayer.PositionChanged += (sender, e) => { Console.Write("\r" + Math.Floor(e.NewPosition * 100) + "%"); }; mediaPlayer.EncounteredError += (sender, e) => { Console.Error.Write("An error occurred"); playFinished = true; }; mediaPlayer.EndReached += (sender, e) => { playFinished = true; }; mediaPlayer.Play(); // Ugly, sorry, that's just an example... while(!playFinished) { Thread.Sleep(TimeSpan.FromMilliseconds(500)); } } } } --我是分隔線-- 問題1. mediaPlayer.PositionChanged += (sender, e) => 這個部份是先告知事件觸發的話,就來執行事件委派的內容, 只是函式內容直接寫在裡面了? 問題2. 如上將Main的內容改為副程式,可能此副程式同時會被呼叫多次, 接收參數為一個識別字串,並建立Dictionary容器, key為識別字串,而value為mediaPlayer的實例, 請問這樣會有問題嗎? 因為副程式內的區域變數playFinished, 在副程式結束後就應該要消失了,不過不明白的是… 實際這麼做了後,程式能正常運行,主要是這點覺得奇怪。 以上兩個重要觀念問題再麻煩大家協助回覆哦,謝謝你們:) ※ 編輯: james999 (220.132.128.217), 02/05/2018 16:40:29
文章代碼(AID): #1QSkS3z1 (C_Sharp)
文章代碼(AID): #1QSkS3z1 (C_Sharp)