簡體   English   中英

通過帶有ref參數的委托傳遞變量

[英]Passing the variable through delegate with ref parameter

有這樣的代表:

public delegate void GraphInit(ref DataMedia media);
public delegate void GraphStop(ref DataMedia media);

我想用這樣的東西:

    void VideoRenderProcess(object sender, VideoRenderingArgs r_args)
    {
        DataMedia obj_mdata = sender as DataMedia;

        switch (obj_mdata.state)
        {
            case GraphState.Running:
                this.Dispatcher.Invoke(new GraphStop(ref obj_mdata));
                break;
            ......
        }
    }

VideoRenderingArgs是自行設計的類:

public class VideoRenderingArgs
{
    public string uri { get; set; }
}
// it's just one string, of course I'm planning to add many other details
// which relate to video, but it's other story

GraphStop()方法是:

    void GraphStop(ref DataMedia media)
    {
        if (media.mre_demux_conf != null) media.mre_demux_conf.WaitOne(2000);

        lock (this)
        {
            if (media.i_main_control != null)
            {   
                media.i_main_control.Stop();
                media.state = GraphState.Stopped;
            }
        }

        GraphClean();
    }

我收到錯誤消息:

'obj_mdata'是一個'variable',但與'method'一起使用,既使用ref又未使用。

如何在C#中做我想做的事情?

不要使用new創建委托。 只需將所需的方法分配給委托變量。

如果您嘗試這樣做,會發生什么:

this.Dispatcher.Invoke(() => GraphStop(ref obj_mdata))

另外,如果您的委托人與相同作用域中的方法同名,您將遇到麻煩!

[不幸的是,以上內容僅適用於.Net 4.5或更高版本。

找到了解決方案:

        public delegate void DGraphInit(ref DataMedia media);
        ...
        if (obj_mdata.state == GraphState.Running)
        {
            object[] data = { obj_mdata };
            DGraphInit delegate2call = new DGraphInit(GraphInit);
            this.Dispatcher.Invoke(delegate2call, data);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM