gpt4 book ai didi

c# - 如何使用 AOP 在 C# 中的不同线程之间共享数据?

转载 作者:IT王子 更新时间:2023-10-29 04:14:37 24 4
gpt4 key购买 nike

如何在不使用静态变量的情况下在 C# 中的不同线程之间共享数据?我们可以使用属性创建这样的机制吗?

在这种情况下,面向方面的编程会有帮助吗?

要实现这一点,所有不同的线程都应该在单个对象上工作吗?

最佳答案

锁定消息队列的简单性无与伦比。我说的是不要把时间浪费在更复杂的事情上。

阅读lock 声明。

lock

编辑

这是一个 Microsoft Queue 对象的示例,因此所有针对它的操作都是线程安全的。

public class Queue<T>
{
/// <summary>Used as a lock target to ensure thread safety.</summary>
private readonly Locker _Locker = new Locker();

private readonly System.Collections.Generic.Queue<T> _Queue = new System.Collections.Generic.Queue<T>();

/// <summary></summary>
public void Enqueue(T item)
{
lock (_Locker)
{
_Queue.Enqueue(item);
}
}

/// <summary>Enqueues a collection of items into this queue.</summary>
public virtual void EnqueueRange(IEnumerable<T> items)
{
lock (_Locker)
{
if (items == null)
{
return;
}

foreach (T item in items)
{
_Queue.Enqueue(item);
}
}
}

/// <summary></summary>
public T Dequeue()
{
lock (_Locker)
{
return _Queue.Dequeue();
}
}

/// <summary></summary>
public void Clear()
{
lock (_Locker)
{
_Queue.Clear();
}
}

/// <summary></summary>
public Int32 Count
{
get
{
lock (_Locker)
{
return _Queue.Count;
}
}
}

/// <summary></summary>
public Boolean TryDequeue(out T item)
{
lock (_Locker)
{
if (_Queue.Count > 0)
{
item = _Queue.Dequeue();
return true;
}
else
{
item = default(T);
return false;
}
}
}
}

编辑 2

希望这个例子对您有所帮助。请记住,这是裸露的骨头。使用这些基本思想,您可以安全地利用线程的力量。

public class WorkState
{
private readonly Object _Lock = new Object();
private Int32 _State;

public Int32 GetState()
{
lock (_Lock)
{
return _State;
}
}

public void UpdateState()
{
lock (_Lock)
{
_State++;
}
}
}

public class Worker
{
private readonly WorkState _State;
private readonly Thread _Thread;
private volatile Boolean _KeepWorking;

public Worker(WorkState state)
{
_State = state;
_Thread = new Thread(DoWork);
_KeepWorking = true;
}

public void DoWork()
{
while (_KeepWorking)
{
_State.UpdateState();
}
}

public void StartWorking()
{
_Thread.Start();
}

public void StopWorking()
{
_KeepWorking = false;
}
}



private void Execute()
{
WorkState state = new WorkState();
Worker worker = new Worker(state);

worker.StartWorking();

while (true)
{
if (state.GetState() > 100)
{
worker.StopWorking();
break;
}
}
}

关于c# - 如何使用 AOP 在 C# 中的不同线程之间共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com