2009-09-10 2 views
1

Я хотел бы реализовать метод одностороннего вызова в C#. Я знаю, что в веб-сервисе мы можем реализовать с использованием атрибута ONE Way. Я прошел через несколько асинхронных вызовов с делегатом. Если у кого-то есть образец кода, который я могу использовать для него.Один способ вызова в C#

+4

Можете ли вы быть более конкретным ... Я не уверен, что кто-то узнает, о чем вы говорите. –

ответ

4

Ну, может быть, самый простой способ эмулировать односторонний вызов - нажать его на пул потоков?

ThreadPool.QueueUserWorkItem(delegate { DoSomeStuff("abc"); }); 

Хотя выше немного страдает от проблем с исключениями, было бы достаточно легко обернуть:

(редактирование: упс, BORKED обработка исключений фиксированной ...)

public static void OneWay(Action action) { 
    if (action == null) throw new ArgumentNullException("action"); 
    ThreadPool.QueueUserWorkItem(delegate { 
     try { action(); } 
     catch (Exception ex) { 
      Trace.WriteLine(ex); 
     } 
    }); 
} 
... 
OneWay(() => DoSomeStuff("abc")); 
+0

После ссылки из одного из комментариев появляется сообщение Фила Хаака, которое по сути является техникой, описывающей этот прекрасный ответ, с некоторым фоном и обсуждением огня и забыванием делегатов. Сообщение называется «Асинхронный огонь и забыть с помощью Lamdas». Обмен сообщениями OneWay широко известен как FireAndForget, поэтому этот ответ прав на деньги. Филата sytax немного более кратким, если вы используете C# 3.0. В любом случае, я прочитал статью. http://haacked.com/archive/2009/01/09/asynchronous-fire-and-forget-with-lambdas.aspx – Nathan

0

Вы можете обернуть асинхронный делегат в вызове метода

public void MyOneWay() 
{ 
    //you can replace the anonymous function with any function you define, if you want 
    var d = delegate(int a) { Console.Write(a);}; 
    d.BeginInvoke(); 
} 

Примечание: Это псевдокод.

+1

MSDN очень специфичен, что BeginInvoke должен быть сопряжен с EndInvoke, за исключением Control. BeginInvoke. –

+0

См. «Важное примечание» здесь: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx –

+0

@Marc - это то, что вы используете _supposed_, чтобы использовать его, или потому, что за кулисами он может расстроиться? Мне нравятся делегаты с огнем и забытьем ... – cjk

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