Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2016, 20:46   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию Сервер отправляет объект не 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, 19:31   #2
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Проблема решена.
NewLamer&Programer вне форума Ответить с цитированием
Старый 21.04.2016, 19:34   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как решил?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.04.2016, 18:55   #4
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сервер принимает пакеты если клиент указывает неверный порт получателя UDP Yandex&Google C/C++ Сетевое программирование 0 12.02.2016 00:03
WCF сервер. экземпляр класса превращается в null. aquaMakc C# (си шарп) 2 13.11.2014 13: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