Просто для удовольствия, вот еще одно решение, которое позволяет избежать оператора switch.
var map = new[] {
new { Value = "4100", StartsWith = false, Result="ABC" },
new { Value = "4101", StartsWith = false, Result="ABC" },
new { Value = "4102", StartsWith = false, Result="ABC" },
new { Value = "4200", StartsWith = false, Result="ABC" },
new { Value = "600A", StartsWith = false, Result="XWZ" },
new { Value = "3*", StartsWith = true, Result="123" },
new { Value = "03*", StartsWith = true, Result="123" },
};
var subarea = ... whatever ...;
var result = map.Where(e =>
{
if (e.StartsWith)
{
return subarea.StartsWith(e.Value);
}
else
{
return subarea == e.Value;
}
}
)
.Select(e => e.Result)
.FirstOrDefault() ?? "ABCXZ123";
Порядок в массиве map
определяет приоритет, так что, например, вы можете иметь точное соответствие на, скажем, «3 * 11», а также совпадение StartsWith
на «3 *», например:
var map = new[] {
new { Value = "3*11", StartsWith = false, Result="ABC" },
new { Value = "4100", StartsWith = false, Result="ABC" },
new { Value = "4101", StartsWith = false, Result="ABC" },
new { Value = "4102", StartsWith = false, Result="ABC" },
new { Value = "4200", StartsWith = false, Result="ABC" },
new { Value = "600A", StartsWith = false, Result="XWZ" },
new { Value = "3*", StartsWith = true, Result="123" },
new { Value = "03*", StartsWith = true, Result="123" },
};
Вы говорите создание нового потока STA диспетчер на этом выполнении нового потока?
Я добираюсь от "этого. Диспетчер. Поток! = Поток. CurrentThread", что Вы ожидаете, что это будет другим диспетчером. Удостоверьтесь что его выполнение иначе это процесс привычки его очередь.
Вызовите синхронно - Вы хотите Диспетчера. BeginInvoke. Кроме того, я полагаю, что Ваш пример кода "еще" должен переместить "SetValue" в оператор.
Это походит на мертвую блокировку; это обычно происходило бы, если бы поток, звоня.Invoke уже содержал блокировку / взаимное исключение / и т.д., который должен завершить поток UI, это - работа. Самый простой подход должен был бы использовать BeginInvoke вместо этого: тем путем текущий поток может продолжать бежать и (по-видимому) выпустит блокировку вскоре - разрешение UI к aquire это. С другой стороны, если можно определить незаконную блокировку, Вы могли бы сознательно выпустить ее на время.