Лучшие практики для «полной асинхронности» при работе с C++/CLIC#

Место общения программистов C#
Ответить
Anonymous
 Лучшие практики для «полной асинхронности» при работе с C++/CLI

Сообщение Anonymous »

Я работаю над устаревшей базой кода, которая имеет поток C++ -> C++/CLI -> C#. Это фоновый процесс командной строки, который не имеет интерактивного элемента пользовательского интерфейса. Я работаю над улучшениями уровня C#, которые включают использование каналов C# для автоматизации рабочего процесса потребителя/производителя и повышения производительности приложения. Раньше все приложение синхронизировалось, но с появлением каналов мне нужно было совершать вызовы WriteAsync/WaitToReadAsync. Я читал о лучших практиках использования async/await, и общее мнение таково, что мне нужно использовать async «до конца».
У меня нет проблем с использованием async/ await вплоть до точки входа моего уровня C#, но мне нужна помощь в понимании наилучшего способа продолжения асинхронности на всем пути вверх по стеку вызовов.
Чрезвычайно Упрощенный обзор моего приложения:

Код: Выделить всё

C++
-------

int main(int argc, char* argv[])
{
// Do some initialization steps

CreateWorker();

// Do some deinitialization steps
}

void CreateWorker()
{
// Create a new thread which will do the processing
THREADHANDLE  threadHandle = m_workerThread.createThread((THREADPROC)WorkerThread, this);
}

int WorkerThread(void * argPtr)
{
// Start the work
(MyObject)* myObject = (MyObject*)argPtr;
myObject->DoWork();

return 1;
}

void MyObject::DoWork()
{
MyMediator mediator;
mediator->ProcessWork();
}

Код: Выделить всё

C++/CLI
----------

void MyMediator::ProcessWork()
{
DotNetProvider provider = gcnew DotNetProvider();
provider->Execute();
}

Код: Выделить всё

C#
---------

string DotNetProvider::Execute()
{
string ret = await DoAsyncWork();
return ret;
}

async Task DoAsyncWork()
{
// Do some work with C# channels here
await channel.Writer.WriteAsync(somedata);
}
Мой текущий подход заключается в добавлении WriteAsync(somedata).ConfigureAwait(false); при выполнении асинхронной работы и запуске Task Task.Run(() => DoAsyncWork( )).GetAwaiter().GetResult(); в DotNetProvider::Execute, чтобы получить результаты и передать их обратно на уровень C++. Насколько я понимаю, этот подход должен работать «нормально» через хак «Пул потоков». Хотя я читал, что у меня могут возникнуть проблемы с нехваткой пула потоков. Есть ли какой-либо передовой опыт, который я могу использовать для решения этой проблемы?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... ough-c-cli
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»