none
WCF и WinForms приложение: timeout при передаче данных RRS feed

  • Вопрос

  • Здравствуйте!

    Yatajga, спасибо большое, что откликнулись.

    Код службы:

    //Контракты:

    [ServiceContract(CallbackContract = typeof(ISortCallback))] public interface ISort { [OperationContract] void Sort(object array); } public interface ISortCallback { [OperationContract(IsOneWay = true)] void SortProcessNotify(int a, int b); }

    //Класс, реализующий серверный контракт

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)]
        public class WCFSort : ISort
        {
            ISortCallback Callback
            {
                get
                {
                    return OperationContext.Current.GetCallbackChannel<ISortCallback>();
                }
            }

            public static void Configure(ServiceConfiguration config)
            {
                ServiceEndpoint se = config.AddServiceEndpoint(typeof(ISort), new WSDualHttpBinding(),
                    "http://localhost:60615/WCFSort.svc");

                config.Description.Behaviors.Add(new ServiceMetadataBehavior
                {
                    HttpGetEnabled = true
                });
                config.Description.Behaviors.Add(new ServiceDebugBehavior
                {
                    IncludeExceptionDetailInFaults = true
                });
            }

            public void Sort(object array_object)
            {
                int tmp = 0;
                int[] array = (int[])array_object;
                for (int i = 0; i < array.Length; i++)
                {
                    for (int j = 0; j < array.Length - 1; j++)
                    {
                        if (array[j] > array[j + 1])
                        {
                            Callback.SortProcessNotify(array[j], array[j + 1]);
                            tmp = array[j];
                            array[j] = array[j + 1];
                            array[j + 1] = tmp;
                        }
                    }
                }

                //for (int i = 0; i < 100; i++)
                //{
                //    Callback.SortProcessNotify(i, i);
                //}
            }
        }

    Код клиента(консольного):

    class Program
        {
            static void Main()
            {
                Random random = new Random();
                InstanceContext context = new InstanceContext(new Client());
                SortClient sort_client = new SortClient(context);
    
                int[] array = new int[1000];
    
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = random.Next(0, 1000);
                }
                Console.WriteLine("Запуск клиента");
                sort_client.Open();
                sort_client.Sort(array);
                sort_client.Close();
                Console.ReadKey();
            }
        }
    
        class Client : ISortCallback
        {
            void ISortCallback.SortProcessNotify(int a, int b)
            {
                Console.WriteLine(a.ToString() + " " + b.ToString());
            }
        }


    Код клиента(WinForms(неполностью))

    private void Form1_Load(object sender, EventArgs e)
            {
                InstanceContext context = new InstanceContext(new Client());
                sort_client = new SortClient(context);
    
                del_th_start = new ParameterizedThreadStart(sort_client.Sort);
                thread = new Thread(del_th_start);
            }
    private void button_sort_start_Click(object sender, EventArgs e)
            {
                sort_client.Open(); //подключается нормально
                richTextBox2.Text = "Подключение к службе установлено";
                thread.Start(array); //а тут, спустя какое-то время, timeout.При этом, если ссылка пустая, то timeout нет.
            }
    //Класс, реализующий клиентский контракт
    class Client : ISortCallback
        {
            void ISortCallback.SortProcessNotify(int a, int b)
            {
                Form1.del_set_text((a.ToString() + " " + b.ToString()) + "\r\n");
    //del_set_text-делегат для доступа к richTextBox, который находится в другом классе и не статичный.
            }
        }

    Клиентский код (класс SortClient) сгенерированы и в консольном приложении и в WinForms служебным средством ServiceModel Metadata Utility Tool.



Ответы

Все ответы

  • Здравствуйте,

    Простите но вопрос не понятен немного. Можете подробнее расписать, кроме кода, в чем именно проблема.

    Модератор
  • Здравствуйте, извините, конечно Вы правы. Суть проблемы, в том, что если передавать в службу непустую ссылку на массив, то после вызова метода Sort возникает исключение - timeout, если же, допустим, закоменнтировать код сортировки, и расскомментировать тот код, что ниже, в котором вызывается метод SortProcessNotify в цикле, и снова вызвать метод Sort, то все работает: данные в режиме реального времени приходят со службы и отображаются на клиенте в richTextBox.
  • Времени пока нет проверить, но попробуйте изменить контракт службы. Вместо object сделайте int[], возможно проблема в сериализации.

    [ServiceContract(CallbackContract = typeof(ISortCallback))]
    public interface ISort
    {
      [OperationContract(IsOneWay = true)]
      void Sort(int[] array);
    }
    

    Модератор