Cross Thread Operation not valid
این کد چرا اجرا نمی شه٬ من Thread دیگه ایجاد نکردم ولی میگه cross Thread Operation no valid?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Test_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void compt()
{
while (true)
{
listBox1.Items.Add(listBox1.Items.Count);
}
}
private void button1_Click(object sender, EventArgs e)
{
ThreadStart Ts = new ThreadStart(compt);
Thread Tr = new Thread(Ts);
Tr.Start();
}
}
}
نقل قول: Cross Thread Operation not valid
جوابش رو فهمیدم:خجالت:
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Test_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
public void compt()
{
try
{
while (true)
{
string x = listBox1.Items.Count.ToString();
listBox1.Items.Add(x);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
ThreadStart Ts = new ThreadStart(compt);
Thread Tr = new Thread(Ts);
Tr.Start();
}
}
}
مقدار CheckForIllegalCrossThreadCalls رو باید false کنید
نقل قول: Cross Thread Operation not valid
سلام
کار جالبی کردی، دوست من، این که نشد راه حل. اینطوری فقط مشکل رو دور زدی و کاری که باید هم انجام نمیشه.
شما یک Thread اصلی داری، یه Thread دیگه هم ایجاد کردی، این میشه دو تا.
حالا میخوای از Thread داخلی به یه کنترل که تو Thread اصلی هست دسترسی پیدا کنی.
این باعث بروز خطا میشه، برای این که برنامهات کار کنه باید تو متد Compt یه تغییراتی بدی.
چون مدت زیادی هست که WinForm کار نکردم ممکنه دقیق نباشه، اما روش اینه:
delegate void VoidDelegate();
این خط رو بالای کلاست قرار میدی.
و تابع compt رو اینطوری نویسی:
private void Compt() {
if ( listBox1.InvokeRequired ) {
listBox1.Invoke( (VoidDelegate)Compt );
return;
}
// do your functions
}
صبا صبوحی
نقل قول: Cross Thread Operation not valid
نقل قول:
نوشته شده توسط
SabaSabouhi
سلام
کار جالبی کردی، دوست من، این که نشد راه حل. اینطوری فقط مشکل رو دور زدی و کاری که باید هم انجام نمیشه.
شما یک Thread اصلی داری، یه Thread دیگه هم ایجاد کردی، این میشه دو تا.
حالا میخوای از Thread داخلی به یه کنترل که تو Thread اصلی هست دسترسی پیدا کنی.
این باعث بروز خطا میشه، برای این که برنامهات کار کنه باید تو متد Compt یه تغییراتی بدی.
چون مدت زیادی هست که WinForm کار نکردم ممکنه دقیق نباشه، اما روش اینه:
delegate void VoidDelegate();
این خط رو بالای کلاست قرار میدی.
و تابع compt رو اینطوری نویسی:
private void Compt() {
if ( listBox1.InvokeRequired ) {
listBox1.Invoke( (VoidDelegate)Compt );
return;
}
// do your functions
}
صبا صبوحی
مرسی جالب بود