0

そのようなデリゲートを持っています:

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

私はそのようにsmthを使いたい:

    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」は「変数」ですが、使用する場合と使用 refしない場合の両方で「メソッド」のように使用されます。

C#でやりたいことをする方法は?

4

2 に答える 2

0

デリゲートの作成に new を使用しないでください。必要なメソッドをデリゲート変数に割り当てるだけです。

これを試すとどうなりますか:

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

また、デリゲートが同じスコープ内のメソッドと同じ名前を持っていると、問題が発生します!

[編集] 残念ながら、上記は.Net 4.5以降でのみ機能します。

于 2013-01-09T13:03:02.333 に答える
0

解決策を見つけました:

        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);
        }
于 2013-01-09T14:20:45.730 に答える