可能重复:
跨线程操作无效:从创建它的线程以外的线程访问控件
public void CheckUnusedTabs(string strTabToRemove)
{
TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
tp.Controls.Remove(this);
TaskBarRef.tabControl1.TabPages.Remove(tp);
}
Run Code Online (Sandbox Code Playgroud)
我试图使用上面的代码关闭Windows应用程序的tabcontrol中的选项卡,我遇到了错误:
跨线程操作无效.
怎么解决这个?
我有一个winforms应用程序,问题与线程有关.因为我调用'MyCustomCode()来创建一个新线程,并调用方法'SomeMethod()'然后访问MessageBox.Show(...).
问题与线程有关,因为新创建的线程正在尝试访问在另一个线程上创建的控件.
我收到错误:
跨线程操作无效:控制'TestForm'从其创建的线程以外的线程访问.
public TestForm()
{
InitializeComponent();
// custom code
//
MyCustomCode();
}
public void SomeMethod()
{
// ***** This causes an error ****
MessageBox.Show(this,
ex.Message,
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
private void InitializeAutoUpdater()
{
// Seperate thread is spun to keep polling for updates
ThreadStart ts = new ThreadStart(SomeMethod);
pollThread = new Thread(ts);
pollThread.Start();
}
Run Code Online (Sandbox Code Playgroud)
更新
如果你看一下这个例子http://www.codeproject.com/KB/cs/vanillaupdaterblock.aspx,CheckAndUpdate方法正在调用MessageBox.Show(..),这就是我的问题所在.我本以为代码很好用!
有趣的是,这个代码在星期五工作得很好???
我正在创建一个Windows窗体应用程序,它根据从数据库中提取的数据动态创建控件.
我在背景中运行的代码很好,它从数据库加载数据并将其应用于变量,我遇到的问题是当尝试使用这些数据创建控件时,我得到一个多线程错误(附加信息:Cross -thread operation无效:控制从其创建的线程以外的线程访问的'flowpanelMenuRules'.)
我正在使用BackgroundWorker_DoWork事件,失败的代码如下:
Me.flowpanelMenuRules.Controls.Add(PanelRule(i))
Run Code Online (Sandbox Code Playgroud)
之前的代码是一个简单的循环,通过变量(从数据库中提取)并收集信息.
有没有人有安全调用上述线路的经验?我似乎无法让它完全工作:(
感谢您的帮助,如果需要,我可以发布更多代码.
如果正在编辑文本的代码"属于"包含Windows窗体的单独线程,如何编辑windows窗体元素中的文本?我得到了例外:
跨线程操作无效:控制'textBox1'从其创建的线程以外的线程访问.
谢谢.
如何从创建它的线程以外的线程访问控件,避免跨线程错误?
这是我的示例代码:
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(foo);
t.Start();
}
private void foo()
{
this.Text = "Test";
}
Run Code Online (Sandbox Code Playgroud) 我一直试图弄清楚如何从后台工作者中获取文本框的文本或其他属性.有人知道怎么做这个吗?我无法将其作为一个参数传递,因为它需要是实时的.谢谢您的帮助!
当我尝试将项目添加到ListBox时,我收到以下错误:
跨线程操作无效:控制'listBox1'从其创建的线程以外的线程访问.
这是尝试代码:
private void Form1_Load(object sender, EventArgs e)
{
Jid jd = new Jid("USERNAME");
xmpp.Open(jd.User, "PASSWORD");
xmpp.OnLogin += new ObjectHandler(xmpp_OnLogin);
agsXMPP.XmppConnection p;
xmpp.OnPresence += new PresenceHandler(xmpp_OnPresence);
}
void xmpp_OnPresence(object sender, Presence pres)
{
listBox1.Items.Add(pres.From .User ); --- **HERE I AM GETTING ERROR.**
}
Run Code Online (Sandbox Code Playgroud)
我有点新的C#和线程,我google搜索了许多文章,包括SO,但我仍然不知道如何解决问题.
我有一个Windows表单,它将永远将数据加载到我的datagridview中.
我一直在这行中得到错误:
dataGridView1.Rows.Add(row);
Run Code Online (Sandbox Code Playgroud)
跨线程操作无效:控制'dataGridView1'从其创建的线程以外的线程访问.
这是我的代码:
public List<string> _checked = new List<string>();
private void getBarcodProperty()
{
string query = "select Name from RfidUnic where Barcode = @barcode";
while (true)
{
while (_checked.Count > 0)
{
SQLiteCommand cmd = new SQLiteCommand(query, sqliteConnection);
cmd.Parameters.AddWithValue("@barcode", _checked[0]);
sqliteConnection.Open();
SQLiteDataReader da = cmd.ExecuteReader();
if (da.Read())
{
if (!da.IsDBNull(0))
{
string[] row = new string[] { da[0].ToString(), "1", _checked[0] };
dataGridView1.Rows.Add(row);
_checked.RemoveAt(0);
}
}
else
{
string[] row = new string[] { "empty", "1", _checked[0] };
dataGridView1.Rows.Add(row); …Run Code Online (Sandbox Code Playgroud) 我是Async和Await的新手,并且创建了一个简单的项目以了解其工作原理。为此,我有一个简单的Windows Form应用程序,其中包含2个元素:
当我单击按钮时,它应该在文本框中显示所有已完成的项目。这是我编写的代码:
private async void btnGetCompletedItems_Click(object sender, EventArgs e)
{
QueueSystem queueSystem = QueueSystem.NewInstance(75);
Stopwatch watch = new Stopwatch();
watch.Start();
await Task.Run(() => GetCompletedItems(queueSystem));
watch.Stop();
lblTime.Text = $"{watch.ElapsedMilliseconds.ToString()} ms";
}
private void GetCompletedItems(QueueSystem queueSystem)
{
foreach (var item in queueSystem.GetCompletedItems())
{
txtItems.Text += $"{txtItems.Text}{item.ItemKey}{Environment.NewLine}";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我在
txtItems.Text + = $“ {txtItems.Text} {item.ItemKey} {Environment.NewLine}”;
错误说
附加信息:跨线程操作无效:控制'txtItems'是从不是在其上创建线程的线程访问的。
我检查了Debug,并为GetCompletedItems()创建了一个新线程。当我阅读有关Async和Await的文章时,我读到它不一定创建一个新线程,但是由于某种原因它似乎创建了一个新线程。
我对Async和Await的实现和理解错了吗?是否可以在Windows Forms应用程序中使用Async和Await?
我遇到了一个问题,我认为这可能是由于我的类的复杂性将对象传递给对方所以我最小化它并且问题仍然存在:
我有一个在VS2017社区中创建的默认winform项目
在表单上我添加了一个文本框,一个richtextbox,一个backgroundworker和一个用于激活后台工作者的按钮.
我在表单中放入以下代码来填充文本框并在按钮单击时运行worker:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = "Hello";
richTextBox1.Text = "World!";
}
private void button1_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
MessageBox.Show(textBox1.Text);
MessageBox.Show(richTextBox1.Text);
}
}
Run Code Online (Sandbox Code Playgroud)
我运行程序,我不明白接下来会发生什么.
textBox1.Text可从表格访问,以便MessageBox显示正常.richTextBox1.Text无法访问并给我这个错误:
跨线程操作无效:控制'richTextBox1'从其创建的线程以外的线程访问.
为什么?
我假设richTextBox有更多的路由和包装,但.Text属性不完全相同?!这里发生了什么?
编辑:我不认为这是一个重复的标记问题,因为他没有工作,TextBox.Text而我的是.我问的是TextBox和RichTextBox .Text属性之间的区别.
c# ×9
winforms ×7
.net ×1
async-await ×1
asynchronous ×1
richtextbox ×1
textbox ×1
vb.net ×1
xmpp ×1