Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 20.04.2016, 21:46   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
Репутация: 1
По умолчанию Сервер отправляет объект не null, а клиент принимает null (C# WCF)

Помогите пожалуйста! У меня в клиент-серверном приложении творится что-то странное! Короче с сервера на клиент посылается задача, но на клиент она приходит как null. Провел за отладчиком уже несколько дней над этой ошибкой... Проставлял отладочные выводы везде где только можно... Никак не понять каким образом это происходит. Все задачи уходят с сервера не нулевыми это 100%, но как то в полете меняются на null... Самое главное что первые несколько задач клиент принимает и они не null, они нормально передаются. Но в какой то момент раз и null... Вот ссылка на репозиторий с фул проектом: https://github.com/DarkByte2015/CoursedWork_v5. Буду очень признателен если кто то сможет помочь.

Ошибка падает в функции Calculation (на клиенте):
Код:

private async void Callback_GiveJobAsync(object sender, GiveJobEventArgs e)
{
    try
    {
        if (e.Job == null)
            Debug.WriteLine("null value received!");
 
        await Task.Run(() => Calculate(e.Job));
        Dispatch(() => Jobs.Add(e.Job));
        await Proxy.SetResultAsync(e.Job);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.StackTrace);
        Disconnect(null);
    }
}
 
private void Calculate(ClientJob job)
{
    try
    {
        Results = new ConcurrentBag<double>();
        var threadCount = Environment.ProcessorCount;
        var threadStep = (job.Top - job.Bottom) / threadCount;
        var threads = new List<Thread>();
        var x = job.Bottom;
 
        for (var i = 0; i < threadCount; i++, x += threadStep + job.Step)
        {
            var threadTask = new ClientJob()
            {
                Bottom = x,
                Top = x + threadStep,
                Step = job.Step,
                CpuLoading = job.CpuLoading
            };
 
            var thread = new Thread(ThreadHandler);
            threads.Add(thread);
            thread.Start(threadTask);
        }
 
        threads.ForEach(t => t.Join());
        job.Result = Results.Sum();
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.StackTrace);
    }
}

Функция Callback_GiveJobAsync подключена к событию калбэка:
Код:

private void Connect(object param)
{
    try
    {                
        var callback = new ClientCallback();
        callback.GiveJob += Callback_GiveJobAsync;
        callback.ServerIsStopped += Callback_ServerIsStopped;
        var context = new InstanceContext(callback);
        Proxy = new JobServiceClient(context);
        Proxy.Endpoint.Address = new EndpointAddress($"net.tcp://{IP}:{Port}/JobService");
        Proxy.Connect();
        IsConnected = true;
    }
    catch (Exception e)
    {
        IsConnected = false;
        MessageBox.Show(e.Message, "Error!", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

Код:

public class ClientCallback : IJobServiceCallback
{
    public event EventHandler<GiveJobEventArgs> GiveJob;
 
    public event EventHandler ServerIsStopped;
 
    void IJobServiceCallback.OnGiveJob(ClientJob job) => GiveJob?.Invoke(this, new GiveJobEventArgs(job));
 
    void IJobServiceCallback.OnServerIsStopped() => ServerIsStopped?.Invoke(this, new EventArgs());
}

И так уж раскручивая это все выше и выше (вызовы) вот еще функция уже на сервере в которой собственно и передается искомый объект (который null иногда):
Код:

public async void BeginCalculationAsync(ClientJob job)
{
    if (job == null)
        Debug.WriteLine("BeginCalculationAsync: job == null");
 
    Job = job;
    Job.CpuLoading = CpuLoading;
    _Returned = false;
    _Timer.Enabled = true;
    _Stopwatch.Start();
 
    Debug.WriteLine($"Job = {Job}; Job.Bottom = {Job.Bottom}; Job.Top = {Job.Top}; Job.Step = {Job.Step}; Job.Result = {Job.Result}; Job.CpuLoading = {Job.CpuLoading}");
 
    try
    {
        await Task.Run(() => Callback.OnGiveJob(Job));
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
        var args = new ClientAbortedEventArgs(e, Job);
        ClientAborted?.Invoke(this, args);
    }
}

Заметьте специально вывод сделал по условию если задача null. Так вот этот вывод не срабатывает никогда. Следовательно остальной код уже приводить нет смысла. Задача тупо теряется...
NewLamer&Programer вне форума   Ответить с цитированием
Старый 21.04.2016, 20:31   #2
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
Репутация: 1
По умолчанию

Проблема решена.
NewLamer&Programer вне форума   Ответить с цитированием
Старый 21.04.2016, 20:34   #3
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,993
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Как решил?
Alex11223 вне форума   Ответить с цитированием
Старый 22.04.2016, 19:55   #4
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
Репутация: 1
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как решил?
Оказалось причина была в EndCalculationAsync. В функции ClientCalculated она вызывалась, а следом за ней в TryGiveJob вызывалась BeginCalculationAsync. И они выполнялись параллельно.
NewLamer&Programer вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сервер принимает пакеты если клиент указывает неверный порт получателя UDP Yandex&Google C/C++ Сетевое программирование 0 12.02.2016 01:03
WCF сервер. экземпляр класса превращается в null. aquaMakc C# (си шарп) 2 13.11.2014 14:03
Как проверить null или сылка на объект не указывает на экземпляр объекта Kroshandowski Windows Forms 2 17.05.2013 11:50
WCF + XNA, Сервер-клиент Inv1s Общие вопросы .NET 2 08.11.2012 14:29
C# null-объект antoha.by Помощь студентам 2 10.09.2010 11:44


14:22.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru