考えられる可能性はいくつかあります。
解決策 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>
ますが、タスクは使用できません。)