[英]C# Passing method name to parameterizedthreadstart with variable
[英]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 Melody
( melody1
)的实例。 谢谢。
我有几种可能。
解决方案一:使用包装器类
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.