Каждый поток работает со своей собственной копией переменных.
Однако я бы изменил свой appoarch зря. Использование найденной переменной не является потокобезопасным. Возможно, что одновременно будет найдено более одного потока. Также очень возможно, что один поток будет читать его, в то время как другой пишет. [lock][1]
мог бы избежать этого.
Лучший способ решить эту проблему - использовать EventWaitHandle . Таким образом, вам на самом деле не нужно беспокоиться о блокировке, и вы можете встроить режим ожидания или тайм-аут, так что, если не будет отображено «все заявки», ваши потоки не будут работать дольше, чем вы хотите.
internal class ExampleOnExecute
{
private static EventWaitHandle _stopEvent;
public static EventWaitHandle StopEvent
{
get { return _stopEvent ?? (_stopEvent = new EventWaitHandle(false, EventResetMode.ManualReset)); }
}
public static void SpinOffThreads(IEnumerable<object> someCollection)
{
foreach(var item in someCollection)
{
// You probably do not want to manualy create a thread since these ideally would be small workers
// and action BeingInvoke runs in the ThreadPool
Action<object> process = BusyWait;
process.BeginInvoke(item, null, null);
}
}
private static void BusyWait(object obj)
{
// You can wait for however long you like or 0 is not waiting at all
const int sleepAmount = 1;
// Blocks the current thread until the current instance receives a signal, using
// a System.TimeSpan to specify the time interval.
//
// Parameters:
// timeout:
// A System.TimeSpan that represents the number of milliseconds to wait, or
// a System.TimeSpan that represents -1 milliseconds to wait indefinitely.
//
// Returns:
// true if the current instance receives a signal; otherwise, false.
while (!StopEvent.WaitOne(TimeSpan.FromMilliseconds(sleepAmount)))
{
// Do you work here
var foundIt = DidIFindIt();
if (foundIt)
{
// Signal all threads now to stop working we found it.
StopEvent.Set();
}
}
}
private static bool DidIFindIt()
{
return true;
}
}
Здесь является превосходной БЕСПЛАТНОЙ книгой по Threading .