Передача переменной через делегат с параметром ref

Есть такие делегаты:

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() method is:

    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 #?

0
nl ja de

2 ответы

Найди решение:

        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);
        }
0
добавлено

Не используйте new для создания делегата. Просто присвойте переменной делегата метод, который вы хотите.

Что произойдет, если вы попробуете это:

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

Кроме того, у вас возникнут проблемы, если ваш делегат будет иметь то же имя, что и метод в той же области!

[EDIT] Вышеупомянутое работает, к сожалению, только с .Net 4.5 или новее.

0
добавлено
с вашим образцом Я получаю Невозможно преобразовать лямбда-выражение для ввода «System.Delegate», потому что это не тип делегата . Я работаю над COM-объектами и интерфейсами от DirectShow, поэтому довольно сложно не использовать для этого делегирование/интерфейсы.
добавлено автор Secret, источник
не существует никакого решения для ранней версии .net?
добавлено автор Secret, источник
System.Windows.Threading.Dispatcher
добавлено автор Secret, источник
Вы используете .Net 4 или раньше, я думаю - поскольку .Net 4.5 должен поддерживать lambdas с Dispatcher.Invoke (). На самом деле, какой тип вашего диспетчера? Зная, что это поможет! Ни одна из перегрузок здесь не принимает один параметр: msdn.microsoft.com/en-us/library/…
добавлено автор Matthew Watson, источник
Я думаю, что я искал неправильный тип Диспетчера ... какой полный тип Диспетчера вы используете?
добавлено автор Matthew Watson, источник
Я нашел здесь несколько обсуждений: social.msdn.microsoft.com/forums/en-US/wpf/thread/… - кроме этого, к сожалению, я не могу помочь.
добавлено автор Matthew Watson, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot