C # выполнить 2 потока одновременно - PullRequest
4 голосов
/ 27 февраля 2011

Я пытаюсь воспроизвести ошибку потока в HTTP-обработчике.

По сути, рабочий процесс ASP.net создает 2 потока, которые одновременно запускают обработчик HTTP в моем приложении при загрузке определенной страницы.

Внутри обработчика http находится ресурс, который не является потокобезопасным.Следовательно, когда два потока пытаются получить к нему доступ одновременно, возникает исключение.

Я мог бы потенциально поместить оператор блокировки вокруг ресурса, однако я хочу убедиться, что это действительно так.Поэтому я хотел сначала создать ситуацию в консольном приложении.

Но я не могу получить 2 потока для одновременного выполнения метода, как это делает asp.net wp.Итак, мой вопрос, как вы можете создать 2 потока, которые могут выполнять метод одновременно.

Редактировать:

Базовым ресурсом является база данных SQL спользовательская таблица (имеет только столбец имени).Вот пример кода, который я попробовал.

[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void Linq2SqlThreadSafetyTest()
        {
            var threadOne = new Thread(new ParameterizedThreadStart(InsertData));
            var threadTwo = new Thread(new ParameterizedThreadStart(InsertData));

            threadOne.Start(1); // Was trying to sync them via this parameter.
            threadTwo.Start(0);

            threadOne.Join();
            threadTwo.Join();
        }


        private static void InsertData( object milliseconds )
        {
            // Linq 2 sql data context
            var database = new DataClassesDataContext();

            // Database entity
            var newUser = new User {Name = "Test"};

            database.Users.InsertOnSubmit(newUser);

            Thread.Sleep( (int) milliseconds);

            try
            {
                database.SubmitChanges(); // This statement throws exception in the HTTP Handler.
            }

            catch (Exception exception)
            {
                Debug.WriteLine(exception.Message);
            }
        }
    }

1 Ответ

6 голосов
/ 27 февраля 2011

Вы можете просто установить статическое время, чтобы начать свою работу следующим образом.

private static DateTime startTime = DateTime.Now.AddSeconds(5); //arbitrary start time

static void Main(string[] args)
{
    ThreadStart threadStart1 = new ThreadStart(DoSomething);
    ThreadStart threadStart2 = new ThreadStart(DoSomething);
    Thread th1 = new Thread(threadStart1);
    Thread th2 = new Thread(threadStart2);

    th1.Start();             
    th2.Start();

    th1.Join();
    th2.Join();

    Console.ReadLine();
}

private static void DoSomething()
{
    while (DateTime.Now < startTime)
    {
        //do nothing
    }

    //both threads will execute code here concurrently
}
...