2016-05-13 2 views
0

Я работаю над приложением P2P в C#. Это передача файлов с разделом файлов и текстовым чатом.Два потока, работающих в одном списке

На клиенте есть 2 темы, 1 для прослушивания, 1 для отправки. Когда я отправляю файл, он сначала разбивается, скажем, на 10 штук, эти 10 штук добавляются в очередь отправки на клиенте, затем он начинает отправлять фрагмент файла 1. Но теперь я хочу отправить сообщение через тот же канал , Моя идея заключается в том, чтобы вставить это сообщение в список отправки до файла chunk 2. Какая потоковая передача мне нужна для 2 потоков для работы в одном списке? Я учёл объекты, полученные таким образом.

Моя первоначальная идея для функции отправки было что-то вдоль этих линий:

public void Send() 
{ 
    while (IsConnected()) 
    { 
     if (unSentObjects.Count > 1) 
     { 
      Task sendTask = new Task(() => SendObj(unSentObjects[0])); 
      sendTask.Start(); 
     } 
    } 
} 

ответ

0

Вы можете использовать Synchronization Object такие как мьютекс для предотвращения гонки условий или одновременной записи/чтения в одном файле. В основном только один поток сможет получить доступ к объекту.

Если данные являются глобальными для потоков, и все они выполняются один раз, вы можете использовать объект синхронизации просто для того, чтобы сигнализировать, когда использовать глобальные общие данные и когда их не использовать. Кроме того, что использование общих глобальных данных точно так же, вы просто тратите его на использование.

+0

Как флаг, который является 'bool' под названием' ItemInUse'. Этот объект требует ожидания для доступа к нему и использует объекты синхронизации. Фактических данных для вашего приложения нет. Просто, если 'ItemInUse' является ложным, установите для него значение true, а затем сделайте то, что вы хотите с данными, а затем, когда закончите, снова установите его в false. –

+0

Очередь является локальной для потока отправителя, затем поток 2 добавляет новые объекты в очередь отправки. Но я не могу этого сделать, потому что, как вы говорите, это одновременное чтение/запись, но не существует способа добавить новый объект после того, как он отправит кусок 1? – BoinQ

Смежные вопросы