繁体   English   中英

通过引用ParameterizedThreadStart传递结构实例

[英]Passing a struct instance by reference to ParameterizedThreadStart

我想启动一个线程,并作为一个参数通过引用传递一个结构的实例。 ref关键字在使用线程之前工作正常,但我现在似乎无法使用ref

这是我的代码当前的样子:

Thread melodyThread = new Thread(new ParameterizedThreadStart(PlayMelody));
melodyThread.Start(melody1);

private void PlayMelody(object parameter)
{
    Melody melody = (Melody)parameter;
    .
    .
    .
}

我想通过引用传递struct Melodymelody1 )的实例。 谢谢。

我有几种可能。

解决方案一:使用包装器类

using System;
using System.Threading;

namespace Demo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var melody = new Melody { Value = 1 };
            var wrapper = new MelodyWrapper { Melody = melody };

            Thread melodyThread = new Thread(() => PlayMelody(wrapper));

            melodyThread.Start();
            melodyThread.Join();

            Console.WriteLine(wrapper.Melody.Value);
        }

        private static void PlayMelody(MelodyWrapper wrapper)
        {
            Console.WriteLine(wrapper.Melody.Value);
            Thread.Sleep(1000);
            wrapper.Melody.Value = 2;
        }
    }

    public struct Melody
    {
        public int Value;
    }

    public class MelodyWrapper
    {
        public Melody Melody;
    }
}

或者,不使用Lambda:

using System;
using System.Threading;

namespace Demo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var melody = new Melody { Value = 1 };
            var wrapper = new MelodyWrapper { Melody = melody };

            Thread melodyThread = new Thread(PlayMelody);

            melodyThread.Start(wrapper);
            melodyThread.Join();

            Console.WriteLine(wrapper.Melody.Value);
        }

        private static void PlayMelody(object parameter)
        {
            MelodyWrapper wrapper = (MelodyWrapper)parameter;
            Console.WriteLine(wrapper.Melody.Value);
            Thread.Sleep(1000);
            wrapper.Melody.Value = 2;
        }
    }

    public struct Melody
    {
        public int Value;
    }

    public class MelodyWrapper
    {
        public Melody Melody;
    }
}

解决方案二:使用委托并返回新的旋律值

using System;
using System.Threading;

namespace Demo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var melody = new Melody { Value = 1 };
            Func<Melody, Melody> play = PlayMelody;
            var result = play.BeginInvoke(melody, null, null);
            melody = play.EndInvoke(result);
            Console.WriteLine(melody.Value);
        }

        private static Melody PlayMelody(Melody melody)
        {
            Console.WriteLine(melody.Value);
            Thread.Sleep(1000);
            melody.Value = 2;
            return melody;
        }
    }

    public struct Melody
    {
        public int Value;
    }
}

我个人赞成第二种解决方案。 因为它返回一个新值,所以如果您使用此解决方案,则可以使Melody不可变。

(我的首选解决方案使用Task<Melody>但不能使用任务。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM