Я могу только утверждать, что я думал об этом (до прочтения вашего вопроса;). Сначала я бы подстроил места, где это действительно имеет значение; например, точка доступа к БД. Если есть место, которое не должно выполняться в контексте «пользовательского интерфейса» (вы можете сохранить его из http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.current.aspx в потоке пользовательского интерфейса, а затем сравнить его с контекстом синхронизации не из пользовательского интерфейса), тогда выполните Debug.BitchAndMoan () об этом. , Любые более длинные вычисления (которые «должны» быть четко разделены в своих собственных многообразиях, верно;) должны утверждать, что.
Полагаю, вам следует, по крайней мере, сделать тип выполнения функции презентатора настраиваемым через атрибут, которому затем подчиняется прокси. (на всякий случай, если вы хотите, чтобы что-то было сделано серийно).
Отмена задачи на самом деле является проблемой докладчика, но у вас должен быть эталонный объект, который сообщает, что вы хотите остановить. Если вы пойдете по прокси-серверу, вы можете забрать созданные потоки в список задач с помощью IAsyncResult, но все еще остается проблема решить, какой из них должен быть отменен, если одно и то же действие разрешено вызывать несколько раз параллельно. Таким образом, вы должны предоставить заданию подходящее имя для конкретного вызова при запуске; что подразумевает слишком много логики в сторону View -> Presenter, вероятно, должен попросить View спросить пользователя, какая из задач должна быть выполнена.
По моему опыту, это обычно обходится с помощью событий (стиль SCSF). Если бы я делал это с нуля, я бы пошел по доверенному пути, поскольку SCSF причинял столько боли, что я сомневаюсь в здравом уме его дизайнеров.