Мне нужно создать два потока для небольшого проекта F #, который реализует блокировку, чтобы избежать состояния гонки. (Я отсканировал StackOverflow для ответов безрезультатно, поэтому этот пост)
Вот код:
let bookFood _ =
Console.WriteLine("Enter amount of grocery bags: ")
let groceryBags = int(Console.ReadLine())
Console.WriteLine("Enter customer name: ")
let name = string(Console.ReadLine().ToString())
let book bags name orders =
lock(bags,name) (fun()-> orders |> List.map (fun order ->
if order.bags = bags then { order with customer = name }
else order ))
orders <- book groceryBags name orders
ThreadPool.QueueUserWorkItem(WaitCallback(bookFood)) |> ignore
ThreadPool.QueueUserWorkItem(WaitCallback(bookFood)) |> ignore
Thread.Sleep(5000)
Проблема в том, что при запуске этого кода происходит следующее:
Мне предлагается ввести количество продуктовых сумок дважды (как должно быть?), Потому что я дважды вызываю функцию bookFood, верно?)
Затем мне предлагается ввести имя клиента, как только я ввожу это, приложение вылетает со следующей ошибкой: System.FormatException выдано, строка ввода не в правильном формате.
Я всюду искал решение, но сейчас обращаюсь за помощью.
Уточнение:
Как мне решить эту проблему? Это потому, что я неправильно закодировал блокировку или неправильно создаю два потока? Он прекрасно работает, когда я вызываю метод bookFood только один раз, но задача требует, чтобы я создал два потока и использовал блокировку, чтобы избежать состояния гонки, и именно тогда я получаю эту ошибку.
Большое спасибо активному сообществу F #, которое помогает, вы знаете, кто вы есть.