несколько потоков, вызывающих службу wcf - PullRequest
1 голос
/ 02 декабря 2010

ниже - мой простой код для запуска 5 потоков, каждый из которых вызывает службу wcf, которая возвращает отправленное значение, моя проблема в том, что:

public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
        {
            lock (sync)
            {
                count += e.Result;
            }
        }

работает нормально и увеличивает счетчик, но как мне записать, когда все потоки завершены, есть ли у кого-нибудь простой пример кода о том, как вызывать несколько сервисов wcf, которые используют асинхронные методы.

public partial class Threading : Form
{
        public int count;
        ServiceReference1.Service1Client clien = new ServiceReference1.Service1Client();

        public Threading()
        {
            InitializeComponent();
        }

        private void GetData()
        {
            clien.GetDataAsync(1);
        }

        public void DisplayResults()
        {
            MessageBox.Show(count.ToString());
        }

        private object sync = new object();

        public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
        {
            lock (sync)
            {
                count += e.Result;
            }
        }

        public List<Thread> RunThreads(int count, ThreadStart start)
        {
            List<Thread> list = new List<Thread>();
            for (int i = 0; i <= count - 1; i++)
            {
                dynamic thread = new Thread(start);
                thread.Start();
                list.Add(thread);
            }
            return list;
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);
            ThreadStart WcfCall = new ThreadStart(GetData);
            IList<Thread> threads = RunThreads(5, WcfCall);
        }

    }

большое спасибо

Ответы [ 2 ]

0 голосов
/ 02 декабря 2010

Я реализовал решение, используя задачи, код приведен ниже, он работает хорошо, дайте мне знать, если есть какие-либо улучшения, которые я мог бы сделать.

public partial class Tasks : Form
{
    static ServiceReference1.Service1Client clien = new ServiceReference1.Service1Client();
    int count = 0;

    public Tasks()
    {
        InitializeComponent();
    }

    // Define a delegate that prints and returns the system tick count
    Func<object, int> action = (object obj) =>
    {
        int i = (int)obj;
        clien.GetDataAsync(i);

        Console.WriteLine("Task={0}, i={1}, Thread={2}", Task.CurrentId, i, Thread.CurrentThread.ManagedThreadId);

        return i;
    };

    public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
    {
        count += e.Result;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        const int n = 5;

        // create async callback delegate from wcf.
        clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);

        // Construct started tasks
        Task<int>[] tasks = new Task<int>[n];
        for (int i = 0; i < n; i++)
        {
            tasks[i] = Task<int>.Factory.StartNew(action, i);
        }

        try
        {
            // Wait for all the tasks to finish.
            Task.WaitAll(tasks);

            MessageBox.Show(count.ToString());
        }
        catch 
        {

        }

    }
}

ура

0 голосов
/ 02 декабря 2010

Если вы используете .NET 4.0, вы можете использовать Task Parallel Library (TPL) и использовать Tasks вместо Threads.Задачи имеет больше контроля потока.Что вы можете делать с задачами, например,

  // Wait for all the tasks to finish.
  Task.WaitAll(tasks);

Вот пример того, как использовать Задачи и ждать завершения всех задач. здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...