0

スレッドを開始し、パラメータとして構造体のインスタンスを参照渡ししたいと考えています。スレッドを使用する前はrefキーワードは正常に機能していましたが、現在は使用できないようですref

これは私のコードが現在どのようになっているのかです:

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

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

Melodystruct ( )のインスタンスを参照渡ししたいmelody1。ありがとう。

4

1 に答える 1

1

考えられる可能性はいくつかあります。

解決策 1: ラッパー クラスを使用する

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;
    }
}

解決策 2: デリゲートを使用して 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;
    }
}

個人的には、この 2 番目のソリューションを好みます。新しい値を返すため、Melodyこのソリューションを使用した場合は不変にすることができます。

(私の推奨するソリューションは使用しTask<Melody>ますが、タスクは使用できません。)

于 2013-03-30T11:00:07.627 に答える