在.NET中,并发线程之间传递数据的最佳方法通常有如下几种:
CancellationTokenSource
:在多线程环境中,可以利用CancellationTokenSource
来中断和取消任务。这可以在创建任务时使用CancellationTokenSource
作为任务的参数,确保每个任务在需要时可以进行取消。使用类似如下的方法:
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task task1 = Task.Run(() => DoTask1(tokenSource.Token), tokenSource.Token);
Task task2 = Task.Run(() => DoTask2(tokenSource.Token), tokenSource.Token);
// 确保在合适的情况下取消任务
tokenSource.Cancel();
Invoke
方法:在需要异步调用的线程传递参数时,可以使用Invoke
方法。使用类似如下的方法:
public static object InvokeMethodAsync(object instance, MethodInfo methodInfo, params object[] args)
{
return methodInfo.Invoke(instance, args);
}
public static async Task<object> ExecuteAsync(MethodInfo methodInfo, params object[] args)
{
object result;
if (methodInfo.IsPublic)
{
var method = methodInfo.DeclaringType.GetMethod(methodInfo.Name, methodInfo.GetParameterTypes());
result = await method.Invoke(null, args);
}
else
{
result = TypeDescriptor.GetProperties(methodInfo.DeclaringType).Find(methodInfo.Name)?.GetValue(null);
}
return result;
}
// 在需要传递数据的不同线程中使用
void DoTask1()
{
var args = new object[] { "Data" };
var callbackResult = ExecuteAsync(object.GetType(), string.Format("DoTask_{0}", Thread.CurrentThread.ManagedThreadId), args);
}
void DoTask2()
{
var args = new object[] { (byte[])new ImageBytes().GetBytes()[0] };
var callbackResult = ExecuteAsync(object.GetType(), string.Format("DoTask_{0}", Thread.CurrentThread.ManagedThreadId), args);
}
AutoResetEvent
:如果线程间传递的数据不频繁,可以使用AutoResetEvent
来保持线程间的同步。使用类似如下的方法:
static AutoResetEvent reset = new AutoResetEvent(false);
void DoTask1()
{
var data = new byte[] { 1, 2, 3 };
lock (reset)
{
reset.Set(); // 表示数据被接收到
}
}
void DoTask2()
{
while (true)
{
if (reset.WaitOne(0)) // 如果已经接收到数据,则继续循环
{
try
{
// 处理接收到的数据
}
catch (Exception ex)
{
// 处理错误
}
}
}
}
每种方法都有不同的适用场景,可以根据实际需求进行选择。
领取专属 10元无门槛券
手把手带您无忧上云