Получение операции перекрестного потока, не допустимой [дубликат]

Вы можете делать это, даже через серверы, пока можно получить доступ к одной базе данных от другого. Таким образом, если возможно записать SQL-оператор против ServerA. DatabaseA это получает доступ ServerB. DatabaseB. схема . TableWhatever , тогда можно сделать то же самое в LINQ.

, Чтобы сделать это, необходимо будет отредактировать .dbml файл вручную. Можно сделать это в VS 2008 легко как это: щелкните правой кнопкой, выберите Open With... , и выбор XML-редактор .

Взгляд Соединение элемент, который должен быть наверху файла. То, что необходимо сделать, обеспечивают явное имя базы данных (и имя сервера, если отличающийся) для таблиц не в базе данных, на которую указывает та строка подключения.

открывающий тэг для элемент Таблицы в Вашем .dbml похож на это:

<Table Name="dbo.Customers" Member="Customers">

то, Что необходимо сделать, для любой таблицы не в базе данных строки подключения, измените тот Имя атрибут к чему-то как один из них:

<Table Name="SomeOtherDatabase.dbo.Customers" Member="Customers">
<Table Name="SomeOtherServer.SomeOtherDatabase.dbo.Customers" Member="Customers">

при столкновении с проблемами удостоверьтесь, что другая база данных (или сервер) действительно доступна от исходной базы данных (или сервер). В Studio управления SQL Server попытайтесь писать небольшой SQL-оператор, работающий против Вашей исходной базы данных, которая делает что-то вроде этого:

SELECT SomeColumn
FROM OtherServer.OtherDatabase.dbo.SomeTable

, Если , что не работает, удостоверьтесь, что Вы имеете пользователя или входите в систему с доступом к обеим базам данных с тем же паролем. Это должно, конечно, совпасть с тем, используемым в строке подключения Вашего .dbml.

13
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

You can only make changes to WinForm controls from the master thread. You need to check whether InvokeRequired is true on the control and then Invoke the method as needed.

You can do something like this to make it work:

public void CheckUnusedTabs(string strTabToRemove)
{ 
    if (TaskBarRef.tabControl1.InvokeRequired)
    {
        TaskBarRef.tabControl1.Invoke(new Action<string>(CheckUnusedTabs), strTabToRemove);
        return;
    }      

    TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
    tp.Controls.Remove(this);
    TaskBarRef.tabControl1.TabPages.Remove(tp);
}
25
ответ дан 1 December 2019 в 17:45
поделиться

call using invoke, because you're accessing the GUI thread using another thread

 this.Invoke((MethodInvoker)delegate() {CheckUnusedTabs(""); });
20
ответ дан 1 December 2019 в 17:45
поделиться

Set the following variable:

CheckIllegalCrossThreadValidation = false
-3
ответ дан 1 December 2019 в 17:45
поделиться

When using threads and UI controls, in winforms, you need to use InvokeRequired to make changes to the controls.

EDIT.

added an example.

Form, with button and label.

try

private void button2_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(UpdateProcess);
            thread.Start();
        }

        private void SetLabelText(string val)
        {
            label1.Text = val;
        }
        delegate void m_SetLabel(string val);

        private void UpdateProcess()
        {
            int i = 0;

            while (true)
            {
                if (label1.InvokeRequired)
                {
                    m_SetLabel setLabel = SetLabelText;
                    Invoke(setLabel, i.ToString());
                }
                else
                    label1.Text = i.ToString();
                i++;
                Thread.Sleep(500);
            }
        }
5
ответ дан 1 December 2019 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: