С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
1

Сервер отправляет объект не null, а клиент принимает null

20.04.2016, 20:42. Показов 2297. Ответов 33
Метки нет (Все метки)

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

Ошибка падает в функции Calculation (на клиенте):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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 подключена к событию калбэка:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
    }
}
C#
1
2
3
4
5
6
7
8
9
10
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 иногда):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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. Так вот этот вывод не срабатывает никогда. Следовательно остальной код уже приводить нет смысла. Задача тупо теряется...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2016, 20:42
Ответы с готовыми решениями:

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание...

Сервер не принимает сообщения TCP или клиент не отправляет
Столкнулся с такой проблемой что программа клиента принимает сообщения TCP и делает всё правильно....

Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на...

Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам...
Есть сервер и несколько клиентов. Клиент отправляет сообщение сервеу, а сервер это отправляет всем...

33
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 00:16 2
Dark Byte, опять ты?!!!

Не по теме:

Я тебе предложил вариант работы в прошлой теме на Task-ах. Тебе ж не пошло.(хотя тут уже виден маленький прогресс await Task.Run :) уже лучше)

Ты сам себе код запутал и не можешь его заставить корректно работать.
Может тебе стоит это всё переписать? По правильному. Без кучи мусора. И всё заработает!
Задача вроде простая, а код уже на клубок похож.

0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 07:32  [ТС] 3

Не по теме:

Цитата Сообщение от LeniumSoft Посмотреть сообщение
Dark Byte, опять ты?!!!
Ага я :D



Цитата Сообщение от LeniumSoft Посмотреть сообщение
Я тебе предложил вариант работы в прошлой теме на Task-ах. Тебе ж не пошло.(хотя тут уже виден маленький прогресс await Task.Run уже лучше)
Я уже говорил что не имею возможности использоваться Task в той части кода где у меня потоки. Одно из заданий - чтобы клиент достаточно четко соблюдал указанную загрузку процессора. У меня этот код на потоках работает. Но стоит переделать на Task (и Task.Delay соответственно) как загрузка процессора сильно увеличивается по сравнению с указанной. Поэтому лучше оставить все как есть.

Цитата Сообщение от LeniumSoft Посмотреть сообщение
Ты сам себе код запутал и не можешь его заставить корректно работать.
Может тебе стоит это всё переписать? По правильному. Без кучи мусора. И всё заработает!
Задача вроде простая, а код уже на клубок похож.
А где это у меня мусор? У меня нормальный код. Теперь уже даже с соблюдением паттерна MVVM. (тут не видно, но в проекте есть)
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 10:48 4
Цитата Сообщение от Dark Byte Посмотреть сообщение
У меня нормальный код.


C#
1
2
3
4
5
6
7
8
9
public async void BeginCalculationAsync(ClientJob job)
        {
            if (job == null)
            {
                Debug.WriteLine("BeginCalculationAsync: job == null");
                //Тут стоит прервать выполнение! Ато null на клиент попадёт :)
            }
 
            Job = job;
Добавлено через 18 минут
Ещё момент:

У тебя есть метод на сервере:
C#
1
private bool TryGiveJob(ClientViewModel client)
Он может быть вызван из нескольких потоков!

Проверку наличия заданий могут пройти сразу два потока

Допустим, что в Jobs есть одна задача, а наш метод вызвали два потока.

Оба вызова успели пройти проверку
C#
1
2
if (Jobs.Count > 0)
            {
попали в if

Но потом первый вызов залочил выполнение и получил последнюю задачу
C#
1
var job = LockingCall.Invoke(() => Jobs.Dequeue(), client);
при этом второй вызов ожидает(он всё ещё внутри if)
первый вызов выполнение разлочил, второй решил таки получить свою задачу, но получать нечего! Ему достался null
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 11:04  [ТС] 5
LeniumSoft, я уже пробовал залочить эту проверку if (Jobs.Count > 0) не помогло.
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 11:12 6
Цитата Сообщение от Dark Byte Посмотреть сообщение
не помогло
Я тебе на
Цитата Сообщение от Dark Byte Посмотреть сообщение
А где это у меня мусор
указываю!!!!
У тебя куча косяков в коде!

Я пока могу только визуально на код смотреть! Скачать и запустить не могу. Я на работе
Дома может посмотрю. Дебаггер нужен...
0
Эксперт .NET
12557 / 8726 / 1311
Регистрация: 21.01.2016
Сообщений: 32,738
21.04.2016, 12:11 7

Не по теме:

LeniumSoft, что мешает ТС-у дебаггером воспользоваться? Почему ты это должен за него делать?



Добавлено через 1 минуту
Dark Byte, пройдись по своему коду отладчиком. Посмотри что где и как работает на самом деле.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 12:42  [ТС] 8
Цитата Сообщение от LeniumSoft Посмотреть сообщение
У тебя куча косяков в коде!
Каких именно?
Цитата Сообщение от Usaga Посмотреть сообщение
Dark Byte, пройдись по своему коду отладчиком. Посмотри что где и как работает на самом деле.
Цитата Сообщение от Dark Byte Посмотреть сообщение
Провел за отладчиком уже несколько дней над этой ошибкой... Проставлял отладочные выводы везде где только можно...
Какое из этих двух предложений тебе не ясно?
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 12:59 9
Цитата Сообщение от Dark Byte Посмотреть сообщение
Какое из этих двух предложений тебе не ясно?
Госпади... Полегче приятель

Цитата Сообщение от Dark Byte Посмотреть сообщение
Каких именно?
Я тебе уже пару закинул.

Ну и вот это мне поясни

C#
1
Clients.AsParallel().ForAll(c => TryGiveJob(c));
На кой хрен тебе тут Parallel?
У ТЕБЯ LOCK В TryGiveJob
А сам перебор клиентов будет моментальным даже при сотке клиентов.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 14:44  [ТС] 10
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Госпади... Полегче приятель

Не по теме:

Просто бесят такие. Думает он самый умный чтоли. Никто кроме него не догадается отлаживать. Так мало того я написал что отлаживал эту ерунду уже фиг знает сколько, а он в упор не видит.


Цитата Сообщение от LeniumSoft Посмотреть сообщение
Я тебе уже пару закинул.
Про Task ответил.
Цитата Сообщение от LeniumSoft Посмотреть сообщение
На кой хрен тебе тут Parallel?
У ТЕБЯ LOCK В TryGiveJob
А сам перебор клиентов будет моментальным даже при сотке клиентов.
Это исключительно ради функции ForAll. Мне просто у IEnumerable всегда не хватает такой штуки типа ForEach / ForAll. Просто запись короче получается чем foreach цикл писать. Ну вреда то от нее точно нет.
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 14:56 11
Цитата Сообщение от Dark Byte Посмотреть сообщение
Мне просто у IEnumerable всегда не хватает такой штуки типа ForEach
Эм... И для этого ты PLINQ заюзал?

C#
1
2
IEnumerable<string> data = new List<string>() { "sdaasd", "asdasdasd" };
data.ToList().ForEach(line => line += line);
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 14:58  [ТС] 12
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Эм... И для этого ты PLINQ заюзал?
Ну да! Я такой извращенец! А про List я знаю у него тоже есть, но подумай сам - когда я юзаю AsParallel не происходит ровно никаких лишних выделений памяти (ну может какой нибудь внутри новый перечислитель создается максимум), а ты хочешь перекопировать всю последовательность в новый список. Это куда затратнее.
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 15:14 13
Цитата Сообщение от Dark Byte Посмотреть сообщение
но подумай сам - когда я юзаю AsParallel не происходит ровно никаких лишних выделений памяти (ну может какой нибудь внутри новый перечислитель создается максимум)

Не по теме:

=-O Ничё ты вогнал сейчас!!! Надо кофейку хряпнуть по этому поводу....


http://referencesource.microso... a720cd0bca

Там эту коллекцию на части делит и выделяет по асинхронной задаче на каждую часть. А после этого ещё и клеит результаты обратно.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 15:25  [ТС] 14
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Там эту коллекцию на части делит и выделяет по асинхронной задаче на каждую часть. А после этого ещё и клеит результаты обратно.
Ого! Некисло Я не знал как оно работает. Ну чтож, возможно перепишу на обычный foreach. Но это все не в тему. Мне бы мою ошибку исправить... Кстати могу добавить такую инфу. Поймано отладчиком. Объект не теряется в полете. Он просто уже передается null. С трудом но удалось это зафиксировать. Таким образом ошибка передачи отпадает. А вот почему так происходит вопрос открытый!!! Боюсь что что то перехимичено там с асинхронностью на сервере... Где то недосинхронизируется и все кирдык...
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 15:28 15
Цитата Сообщение от Dark Byte Посмотреть сообщение
перехимичено там с асинхронностью на сервере...
Серьёзно?

Ну есть такое дело...

Чуточку перехимичил.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 16:50  [ТС] 16
Хмм мне внезапно пришло в голову что надо собственно выложить этот код где и получается этот null. Если только тут телепаты не успели завестись.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
public class MainViewModel : ViewModelBase
{
    #region Fields
 
    private JobService ServiceInstance;
 
    private ServiceHost ServiceHost;
 
    private Queue<ClientJob> Jobs = new Queue<ClientJob>();
 
    private int JobCount;
 
    private List<double> Results = new List<double>();
 
    private bool _IsRunning = false;
 
    private bool _IsWorking = false;
 
    private double _ProgressValue = 0.0;
 
    private long _TimeLost = 0;
 
    private double? _ResultValue = null;
 
    #endregion
 
    #region Properties
 
    public bool IsRunning
    {
        get { return _IsRunning; }
        private set { Set(nameof(IsRunning), ref _IsRunning, value); }
    }
 
    public bool IsWorking
    {
        get { return _IsWorking; }
        private set { Set(nameof(IsWorking), ref _IsWorking, value); }
    }
 
    [Range(0, 10000)]
    public double BottomValue { get; set; } = 0;
 
    [Range(0, 10000)]
    public double TopValue { get; set; } = 100.0;
 
    [Range(0, 10000)]
    public double StepValue { get; set; } = 0.000001;
 
    public double ProgressValue
    {
        get { return _ProgressValue; }
        set { Set(nameof(ProgressValue), ref _ProgressValue, value); }
    }
 
    public long TimeLost
    {
        get { return _TimeLost; }
        set { Set(nameof(TimeLost), ref _TimeLost, value); }
    }
 
    public double? ResultValue
    {
        get { return _ResultValue; }
        set { Set(nameof(ResultValue), ref _ResultValue, value); }        
    }
 
    public ObservableCollection<ClientViewModel> Clients { get; } = new ObservableCollection<ClientViewModel>();
 
    #endregion
 
    #region Commands
 
    public ICommand ChangeStateCommand { get; }
 
    public ICommand SolveCommand { get; }
 
    public ICommand StopServerCommand { get; }
 
    #endregion
 
    public MainViewModel()
    {
        Application.Current.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
        ChangeStateCommand = new RelayCommand(ChangeStateAsync);
        SolveCommand = new RelayCommand(SolveAsync, o => IsRunning && !IsWorking && !HasValidationErrors);
        StopServerCommand = new RelayCommand(StopServer, o => IsRunning);
    }
 
    private async void ChangeStateAsync(object param) => await Task.Run(() => ChangeState(param));
 
    private void ChangeState(object param)
    {         
        if (IsRunning && IsWorking)
        {
            Jobs.Clear();
            IsWorking = false;
        }            
 
        if (!IsRunning)
            StartServer(null);
        else
            StopServer(null);
 
        ProgressValue = 0.0;
    }
 
    private void StartServer(object param)
    {
        IsRunning = true;
        ServiceInstance = new JobService();
        ServiceInstance.ClientConnected += ClientConnected;
        ServiceInstance.ClientDisconnected += ClientDisconnected;
        ServiceInstance.ClientCalculated += ClientCalculated;
        ServiceHost = new ServiceHost(ServiceInstance);
        ServiceHost.Open();
    }
 
    private void StopServer(object param)
    {
        IsRunning = false;
        Clients.AsParallel().ForAll(c => c.DisconnectAsync());            
        ServiceHost.Close();
        Dispatch(() => Clients.Clear());
        ProgressValue = 0.0;
        TimeLost = 0;
        ResultValue = null;
    }
 
    private async void SolveAsync(object param) => await Task.Run(() => Solve(param));
 
    private void Solve(object param)
    {
        IsWorking = true;
        TimeLost = 0;
        ResultValue = null;
 
        foreach (var job in ClientJob.Distribute(BottomValue, TopValue, 1.0))
        {
            job.Step = StepValue;
            Jobs.Enqueue(job);
        }
 
        JobCount = Jobs.Count;
        Clients.AsParallel().ForAll(c => TryGiveJob(c));
 
        while (LockingCall.Invoke(() => Results.Count != JobCount, JobCount)) ;
 
        ResultValue = Results.Sum();
        Results.Clear();
 
        IsWorking = false;
    }
 
    private void ClientConnected(object sender, ClientChangeStateEventArgs e)
    {
        var client = new ClientViewModel(e.Callback, e.Address);
        client.ClientAborted += ClientAborted;
        Dispatch(() => Clients.Add(client));
        TryGiveJob(client);
    }
 
    private void ClientDisconnected(object sender, ClientChangeStateEventArgs e)
    {
        var client = Clients.First(c => c.Callback == e.Callback);
        RemoveClient(client);
    }
 
    private void ClientAborted(object sender, ClientAbortedEventArgs e)
    {
        var client = sender as ClientViewModel;
        RemoveClient(client);
    }
 
    private void ClientCalculated(object sender, ClientCalculatedEventArgs e)
    {
        var client = Clients.First(c => c.Callback == e.Callback);
        client.EndCalculationAsync();
        ProgressValue = (JobCount - Jobs.Count) * 100 / JobCount;
        TimeLost = client.LastDuation * Jobs.Count;
        LockingCall.Invoke(() => Results.Add(e.Job.Result), sender);
        TryGiveJob(client);
    }
 
    private bool TryGiveJob(ClientViewModel client)
    {
        if (LockingCall.Invoke(() => Jobs.Count > 0, client))
        {
            if (LockingCall.Invoke(() => Jobs.Peek() == null, client))
                Debugger.Launch();
 
            var job = LockingCall.Invoke(() => Jobs.Dequeue(), client);
            client.BeginCalculationAsync(job);
            return true;
        }
        else
            return false;
    }
 
    private void RemoveClient(ClientViewModel client)
    {
        if (client.IsCalculating)
            LockingCall.Invoke(() => Jobs.Enqueue(client.Job), JobCount);
 
        Dispatch(() => Clients.Remove(client));
    }
 
    private void Dispatch(Action action) => Application.Current.Dispatcher.Invoke(action);
 
    private void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        e.Handled = true;
        MessageBox.Show(e.Exception.Message, "Error!", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}
0
Эксперт .NET
12557 / 8726 / 1311
Регистрация: 21.01.2016
Сообщений: 32,738
21.04.2016, 18:49 17
Какая-то каша, всё в кучу накидано)) Почему ViewModel умеет в MessageBox? Зачем столько асинхрона, если тут же локи используются? А это зачем: Clients.AsParallel().ForAll(c => c.DisconnectAsync()); ?
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 19:34  [ТС] 18
Цитата Сообщение от Usaga Посмотреть сообщение
Почему ViewModel умеет в MessageBox?
А почему нет? Я только недавно начал изучать MVVM, но не слышал чтобы ViewModel не могла кидать MessageBox.
Цитата Сообщение от Usaga Посмотреть сообщение
Зачем столько асинхрона, если тут же локи используются?
Чтобы интерфейс не подвисал. А локи потому что чуть что не синхронизируешь как сразу появляются вот такие печальные последствия как этот null.
Цитата Сообщение от Usaga Посмотреть сообщение
А это зачем: Clients.AsParallel().ForAll(c => c.DisconnectAsync()); ?
Цитата Сообщение от Dark Byte Посмотреть сообщение
Это исключительно ради функции ForAll. Мне просто у IEnumerable всегда не хватает такой штуки типа ForEach / ForAll. Просто запись короче получается чем foreach цикл писать. Ну вреда то от нее точно нет.
Уже исправил.

Добавлено через 30 минут
Проблема решена. Оказалось причина была в EndCalculationAsync. В функции ClientCalculated она вызывалась, а следом за ней в TryGiveJob вызывалась BeginCalculationAsync. И они выполнялись параллельно.
0
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
21.04.2016, 19:38 19
Цитата Сообщение от Dark Byte Посмотреть сообщение
Проблема решена.
Чудно! Ато я уже качать ваше чудо собрался.
0
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
21.04.2016, 20:12  [ТС] 20
А можете подсказать еще одну вещь? Видите у меня там свойство TimeLost? Оно типа того обозначает оставшееся время. Высчитывается чрезвычайно примитивным способом который был задан по заданию курсача. Просто берется время за которое выполнилась последняя задача и умножается на количество оставшихся задач. Так вот это время у меня почему то в начале при запуске вычислений начинает расти, а потом идет на спад. Почему так происходит? Насколько я понял у меня вроде как в начале время рассчета одной задачи выше чем в конце. Это как то странно... Все они по одинаковому алгоритму считаются. И у всех один и тот же диапазон.
0
21.04.2016, 20:12
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2016, 20:12
Помогаю со студенческими работами здесь

Datetime не принимает значение NULL
Ну вот и весь вопрос ). В MySQL 5.5 пытаюсь создать запись из командной строки, для этого поля...

CheckBox не принимает Null через Binding
В listView через &lt;ListView.ItemTemplate&gt; заполняется CheckBox-ами инициализированными значениями из...

Не работает код: m_web1.Navigate ('gidro.htm',0,0,NULL,NULL);
Друзья помогите начинаюшему значит делаю m_web1.Navigate ('с:\gidro.htm',0,0,NULL,NULL);работает...

UPDATE SELECT, ERROR: null value in column violates not-null constraint
Здравствуйте. Две таблицы, из одной значением integer модифицируется int другой таблицы. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru