Как надежно обнаружить, если инициализатор объекта не установил свойство?C#

Место общения программистов C#
Ответить
Anonymous
 Как надежно обнаружить, если инициализатор объекта не установил свойство?

Сообщение Anonymous »

Мой пользовательский элемент управления - это граница , которая была изменена для поддержки привязанного FrameID , которое пользователь библиотеки будет определять как enum в клиентском XAML, который они разрабатывают. Как показано ниже, свойство FrameID либо "IS", либо "не" установлен.

Код: Выделить всё






















< /code>
Идентификатор используется для начальной загрузки приложения путем запуска поток обнаружения в фоновом режиме. Это перечисление может занять секунду или два, но пользовательский интерфейс стремится сохранять отзывчивые запуска, не ожидая этого. Основная задача заключается в надежном обнаружении, не было ли установлено назначение свойств  < /em> в XAML, чтобы одноразовое обнаружение можно было запустить в конфигурации по умолчанию. < /P>

[b] мой вопрос [/b] 
это [b]  с уверенностью предположить  [/b], что конструктор и инициализатор объекта [b]  гарантированно  [/b] выполнить последовательно [b]  без прерывания  [/b] в потоке пользовательского интерфейса, на котором их вызывают?   
Потому что  Если ответ «да» < /em>, тогда мой предпочтительный вариант очень наполнен, он, кажется, работает отлично, и я считаю, что это представляет собой худший пример путем настройки задержка на один тик. У меня есть как минимум два других способа, которыми я мог обнаружить это, но они менее оптимальны. Конечно, если  вы  можете подумать о любой альтернативе, которая достигает цели более надежным образом, я слушаю. Frameid < /h5>
enum Reserved { DefaultId, }

interface IDiscoveryMonitor { event EventHandler Discovered; }

class FrameWithId : Border, IDiscoveryMonitor
{
public FrameWithId()
{
Stroke = SolidColorBrush.Transparent;
var idB4 = FrameId;
Task
.Delay(TimeSpan.FromTicks(1))
.GetAwaiter()
.OnCompleted(() =>
{
// - This ASSUMES that CTOR and Object Initializer cannot
//   be separated in time under any circumstances.
// - This assumption APPEARS TO BE RELIABLE HERE.
// - But IS IT REALLY ???
var idFtr = FrameId;
Debug.WriteLine($"ID Before {idB4} => ID After {idFtr}");
if(Equals(idFtr, Reserved.DefaultId))
{
// The ID has 'not' been set so run discovery for default.
_ = MockRunDiscovery();
}
});
}
.
.
.

< EM> Вывод от DEBUG.WriteLine (...) < /code> операторы < /em> < /p>

Bindable FrameID свойство

Код: Выделить всё

    .
.
.
public static readonly BindableProperty FrameIdProperty =
BindableProperty.Create(
propertyName: nameof(FrameWithId.FrameId),
returnType: typeof(Enum),
declaringType: typeof(FrameWithId),
defaultValue: Reserved.DefaultId,
defaultBindingMode: BindingMode.OneWay,
propertyChanged: (bindable, oldValue, newValue) =>
{
if (bindable is FrameWithId @this)
{
_ = @this.MockRunDiscovery();
}
});
.
.
.
mre
Минимальный проект можно найти в этом репо. Это может прояснить, если кто -то запустил.

Подробнее здесь: https://stackoverflow.com/questions/794 ... a-property
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»