PDA

View Full Version : خطای The calling thread cannot access this object را چطور بر طرف کنم



PetekDincos
شنبه 25 آذر 1391, 22:20 عصر
با سلام
من در MessageBox شخصی برای اینکه بتونم یه شمارنده نشون بدم میام در متد Show مربوط به MessageBox یه BackgroundWorker رو Run می کنم و در متد ProgressChanged بگراند ورکر یه پراپرتی مثلا MyProp از یه کلاس که از DependencyObject ارث بری کرده مقدار دهی می کنم و کنترل TextBlock توی MessageBox رو با این پراپرتی بایند می کنم چون متد ها Static هستند نمیشه به صورت مستقیم در داخل متدها کنترلها رو داشت و موقع مقدار دهی متد MyProp در داخل ProgressChange بگراند این خطا رو صادر می کنه
The calling thread cannot access this object because a different thread owns it.
برای رفع این مشکل دوستانی که اطلاع دارند راهنمایی کنند . با تشکر

sia_2007
شنبه 25 آذر 1391, 22:53 عصر
من که هر چی خوندم نفهمیدم چه کار کردی
ولی کدی رو که خطا می ده رو پاس بده به Dispather.BeginInvoke(new Action() => { Your Code goes here;} ); Test

PetekDincos
یک شنبه 26 آذر 1391, 11:06 صبح
با سلام
من یه کلاس دارم به این صورت که داخلش یه پراپرتی تعریف کردم


public class MyCheckedBinding : DependencyObject
{
public static readonly DependencyProperty CountShutDownProperty =
DependencyProperty.Register("CountShutDown", typeof(string),
typeof(MyCheckedBinding), new UIPropertyMetadata(string.Empty));
public string CountShutDown
{
get { return (string)GetValue(CountShutDownProperty); }
set { SetValue(CountShutDownProperty, value); }
}
}

و در متد Show مسیج باکس که به صورت Static می باشه یه Backgroundworker رو تعریف می کنم و Run می کنم و در متد ProgressChange بگراندورکر به صورت زیر اون پراپرتی رو مقدار دهی می کنم



private static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
MyCheckedBinding.Instance.CountShutDown = e.ProgressPercentage.ToString();
}

و این پراپرتی رو به تکست یه TextBlock به صورت زیر بایند می کنم



Text="{Binding Source={x:Static local:MyCheckedBinding.Instance},Path=CountShutDow n}"


الان وقتی در متد bw_ProgressChanged این پراپرتی می خواد مقدار دهی بشه توسط e.ProgressChange این خطا رو می ده

The calling thread cannot access this object because a different thread owns it.

د و در ضمن اگه راه حل دیگه ای دارید برای اینکه بشه در MessageBox یه شمارنده قرار داد ممنون می شم راهنمایی کنید . با تشکر

hosseinaryai
دوشنبه 08 مهر 1392, 21:46 عصر
PetekDincos (http://barnamenevis.org/member.php?169796-PetekDincos) عزیز من هم با همین مشکل و خطا مواجه ام .. راه حلشو بالاخره پیدا کردی ؟ .. من که هر چی گشتم چیزی ندیدم

helpsos
سه شنبه 09 مهر 1392, 10:49 صبح
سلام
آیا شما یه MessageBox می خواهید که بعد از یه زمانی مثلا محو بشه؟

hi level hdd
پنج شنبه 11 مهر 1392, 10:03 صبح
توی WPF نمیشه مالتی ترد به اشیا دیگه این گونه دسترسی داشت. باید این کار رو انجام بدید

مثلا میخواهید بگید داخل بک گراند ورکر متن تکست باکسم بشه یه کانتری
txtbox.dispacher.invoke(new action{delegate{txtbox.text = counter});}

یعنی دیسپچر اون آبجکتی که میخواهید باهاش کارکنید رو گرفته و یه تابع بهش پاس می دید. توی اون تابع میشه با تکست باکس یا هر شیئی که دیسپچر مربوط به اون هست میشه با پروپرتیهاش کار کرد