了解C#线程面试问题

时间:2019-01-23 21:26:33

标签: c# .net thread-safety

我最近在C#采访中被问到线程安全性问题。我没有完全正确。 我正在尝试了解它。 这是问题...

给出基本的Order类...

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()
        {
        }
    }
}

如何确保worker类中的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;
                //}
            });
            //  }
        }
    }
}

我要理解的第一个问题是,如何使第二个线程示例设置传入的Order并更改较早的计时器? 例如,导致线程数据冲突。

我已经尝试过这种方法,但是它似乎总是能按预期运行...

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();
        }
    }
}

我该如何在这里解决我要解决的问题?

0 个答案:

没有答案