Итак, я пишу библиотеку клиентских API PCL (.NET 4.5, SL 5, Win8, WP8.1, WP SL 8), и я решил, что я только позволю себе HTTP-запрос за раз. В настоящее время я использую TPL, чтобы сделать их:TPL и монитор в PCL
Task.Factory.FromAsync<Stream>(httpReq.BeginGetRequestStream, httpReq.EndGetRequestStream, null).ContinueWith<Task<WebResponse>>((requestStreamTask) =>
{
return Task<WebResponse>.Factory.FromAsync(httpReq.BeginGetResponse, httpReq.EndGetResponse, null);
}).Unwrap().ContinueWith<HttpWebResponse>((getResponseTask) =>
{
return (HttpWebResponse)getResponseTask.Result;
});
Так что я хочу, чтобы добавить блокировку, чтобы предотвратить более одного запроса от перехода на один раз. Я знаю, что могу просто позвонить Monitor.Enter
, прежде чем начать, и позвонил Monitor.Exit
в последних ContinueWith
. Но на основе Migrating lock to TPL я не могу использовать Monitor
, так как это возможно из-за проблем с потоками. У меня нет проблем с использованием другого объекта блокировки, такого как рекомендация, но, насколько я могу судить в моем PCL, единственной блокировкой, которую я имею в наличии, является Monitor.
Итак, что мне делать?
EDIT: После разговора с Юваль Itzchakov ниже я понял причину я только иметь Monitor
класс для синхронизации, потому что у меня есть поддержка Silverlight 5 в моем PCL. Если нет другого способа, я рассмотрю отказ от поддержки SL5, но я бы предпочел.
EDIT2: После беспорядка я понял, что у меня есть класс ManualResetEvent
, могу ли я использовать его?
Это звучит, как вы можете использовать шаблон производитель/потребитель, где один поток отвечает за все запросы HTTP - вы создаете очередь из них, и поток обрабатывает очередь. Вы можете посмотреть «BlockingCollection» или, возможно, даже поток данных TPL. –
Я искал использование 'BlockingCollection', но он не поддерживается в конфигурации PCL, которую я использую. То же самое с потоком данных TPL. –
shmuelie