Мне недавно задали вопрос безопасности потока в интервью c #. Я не совсем понял.
Я пытаюсь понять это сейчас.
Вот вопрос ...
Учитывая базовый класс заказа ...
using System;
namespace OrderThreadTest
{
public class Order
{
public TimeSpan CancelTime;
public int Id;
}
}
Учитывая простую заглушку класса расписания, я реализовал ее для тестирования дома ...
using System;
using System.Threading;
namespace OrderThreadTest
{
public class Scheduler : IDisposable
{
private Timer _timer;
public IDisposable Schedule(Order order, Action action)
{
var current = DateTime.Now;
var timeToGo = order.CancelTime - current.TimeOfDay;
_timer = new Timer(x => { action(); }, null, timeToGo, Timeout.InfiniteTimeSpan);
return this;
}
public void Dispose()
{
}
}
}
Как вы гарантируете, что метод Cancel в рабочем классе является поточно-ориентированным?
Мой ответ - закомментированные фрагменты
using System;
namespace OrderThreadTest
{
public class Answer
{
private readonly Scheduler _scheduler;
private object _myLock = new object();
private Order _order;
public Answer(Scheduler scheduler)
{
_scheduler = scheduler;
}
public void Cancel(Order order)
{
// lock (_myLock)
// {
// _order = order;
// var result =
_scheduler.Schedule(order, () =>
{
//if (order.Equals(_order))
//{
Console.WriteLine("Canceled: " + order.Id);
order = null;
//}
});
// }
}
}
}
Мой первый вопрос в понимании этого состоит в том, как я могу привести пример второго потока, устанавливающего переданный в порядке и изменяющий более ранний таймер?
Например, вызвать конфликт данных потока.
Я пробовал вот так, но, кажется, всегда работает как ожидалось ...
using System;
namespace OrderThreadTest
{
internal class Program
{
private static void Main(string[] args)
{
var a1 = new Answer(new Scheduler());
var o = new Order
{Id = 1, CancelTime = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second + 5)};
a1.Cancel(o);
a1.Cancel(o);
Console.ReadLine();
}
}
}
Как мне воспроизвести проблему, которую я собираюсь решить здесь?