Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
в Пошук

WCF, Silverlight, "while(true)"

Останнє повідомлення 31-05-2010, 12:25 від Sergey Lutay. 1 відповіді.
Сортувати: Попереднє Наступне
  •  31-05-2010, 1:58 9768

    WCF, Silverlight, "while(true)"

    Здравствуйте!
    Использую связку Silverlight 3 + WCF (polling duplex). Вот так выглядят интерфейсы wcf:

    [ServiceContract(CallbackContract = typeof(ISilverlightSender))]

    public interface IUiSvc

    {

    [OperationContract(IsOneWay = true)]

    void Main(string data);

    }


    public interface ISilverlightSender

    {

    [OperationContract(IsOneWay = true)]

    void SendData(string data);

    }


    В Main() запускается бесконечный цикл, в котором через именованный канал поступают данные из третьего источника(он работает локально), ну и эти данные, через callback-метод пересылаются на silverlight-клиент(такая ужасная схема из-за того, что приходится внедряться в другой проект).
    Проблема заключалась в том, что при повторном вызове метода Main() ни чего не происходило (например, в него передали из silverlight некоторый параметр, который он разбирает на месте и по нему далее должен что-то делать).
    На данный момент решил проблему следующим образом:

    private bool _isRun = false;
    private static ISilverlightSender _infClient;

    public static void Infinity()
    {
        while (true)
        {
            var recv = new NamedPipeServerStream("mypipe",
    PipeDirection.In);
            recv.WaitForConnection();
            string result = "";
            using (var sr = new StreamReader(recv))
            {
                string tmp;
                while ((tmp = sr.ReadLine()) != null)
                    result += tmp;
            }
            _infClient.SendData(result);

            //после добавления этой строчки все
            //заработало, как требуется:
            Thread.Sleep(5);
        }
    }

    public void Main(string data)
    {
        <...>
       
        if (_isRun == false)
        {
            var thread = new Thread(Infinity) { IsBackground = true };
            _infClient =
    OperationContext.Current.GetCallbackChannel<ISilverlightSender>();
            _isRun = true;
            thread.Start();
        }
    }


    Основная загвоздка в том, что посылать данные в silverlight нужно без его запроса(отсюда и бесконечный цикл). Но принимать и обрабатывать данные в WCF необходимо по запросу из silverlight.
    Мне очень кажется, что такой способ какой-то "костыльный", подскажите, что я делаю не так)
    Спасибо!
    Помічено як: ,
  •  31-05-2010, 12:25 9770 у відповідь на 9768

    Re: WCF, Silverlight, "while(true)"

    Привет.

    Возможная причина, это то что данные на клиент отправляются в другом потоке.

    В 4-м Silverlight Polling Duplex улучшился по работе и по производительности. Попробуйте использовать его.


    С уважением,
    Сергей Лутай.

    Руководитель департамента разработки Silverlight приложений, компания Digital Cloud Technologies.
    Silverlight MVP, MCT, MCPD
Переглядати як новосний Блог RSS в XML