это произошло со мной, потому что я попытался выполнить access UI
компонент в another thread insted of UI thread
, как этот
private void button_Click(object sender, RoutedEventArgs e)
{
new Thread(SyncProcces).Start();
}
private void SyncProcces()
{
string val1 = null, val2 = null;
//here is the problem
val1 = textBox1.Text;//access UI in another thread
val2 = textBox2.Text;//access UI in another thread
localStore = new LocalStore(val1);
remoteStore = new RemoteStore(val2);
}
, чтобы решить эту проблему, обернуть любой вызов ui внутри , о чем упоминал Кандид в своем ответе
private void SyncProcces()
{
string val1 = null, val2 = null;
this.Dispatcher.Invoke((Action)(() =>
{//this refer to form in WPF application
val1 = textBox.Text;
val2 = textBox_Copy.Text;
}));
localStore = new LocalStore(val1);
remoteStore = new RemoteStore(val2 );
}
Различие - то, что 1-е явно создает анонимный тип. 2-е является выражением запроса и может использовать существующий тип вместо того, чтобы создать анонимный тип. Из документации, связанной Cameron MacFarland:
выражения Запроса не всегда требуют создания анонимных типов. Когда возможно, они используют существующий тип для содержания данных столбца. Это происходит, когда запрос возвращает или целые записи из источника данных или только одно поле от каждой записи.
Мое понимание - то, что нет никакого различия.
New With
нацелен к использованию из запроса как
Dim X = New With { .Surname = "A", .Forename = "B" }
Специально для запросов Linq, можно пропустить New With
, но это все еще полезно для других ситуаций. Я не уверен, однако, так как я не знаю VB 9 :)
Нет никакого функционального различия между двумя частями кода, который Вы перечислили. Под капотом оба кода частей будут использовать анонимный тип для возврата данных из запроса.
первая часть кода просто делает использование анонимного типа явным. Причина, которую позволяется этот синтаксис, состоит в том, что возможно возвратить любой тип из Избранного пункта. Но тип должен использоваться явно.
Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }
Joel является неправильным в своем операторе, что второй запрос может использовать существующий тип. Без явного типа избранный пункт, который использует явное имя свойства, будет всегда возвращать анонимный тип.
Их называют Анонимные Типы .
, главная причина для их использования состоит в том, чтобы сохранить данные из запроса в отдельном объекте, таким образом, итераторы могут продолжить выполнять итерации по списку объектов.
Они имеют тенденцию работать временными типами для устройства хранения данных посреди большого или многослойного запроса LINQ.
Одно различие - то, что Анонимные типы не являются сериализуемыми.
Нет никакой разницы. Компилятор определит анонимный тип.
Скорее всего, вы захотите вернуть значение элементов, как в e.
, которое возвращает String вместо XElement.
Второй пример можно упростить как
Dim ee = From e In someXML.<Employee> _
Select e.<Surname>.Value, e.<Forename>.Value
, потому что компилятор также выведет имена членов анонимного типа.
Однако, если у вас есть следующий класс
Class Employee
Private _surname As String
Public Property Surname() As String
Get
Return _surname
End Get
Set(ByVal value As String)
_surname = value
End Set
End Property
Private _forename As String
Public Property Forename() As String
Get
Return _forename
End Get
Set(ByVal value As String)
_forename = value
End Set
End Property
End Class
, вы можете изменить 1-й запрос, чтобы создать IQueryable (Of Employee)
вместо анонимного типа с помощью New ... Примерно так:
Dim ee = From e In someXML.<Employee> _
Select New Employee With {.Surname = e.<Surname>.Value, _
.Forename = e.<Forename>.Value}