عدم اجرای دستورات درون شرط If بدون استفاده از Breakpoint
من در حال توسعه و نوشتن یک برنامه ویندوزی با wpf و سی شارپ با پایگاه داده sql هستم.
به یک مشکل عجیب برخوردم.
برای کمبوباکس موجود در پنجره رخداد زیر تعریف شده
private void ComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (PublicVariables.LimitedDisplayMenues == false)
{
// do
}
else
{
if(CheckInsemination() == false)
{
//do
}
}
}
که تابع فراخوانی شده به شکل زیر هست
private bool CheckInsemination()
{
var dupParam = new SqlParameter("DuplicateData", System.Data.SqlDbType.Bit)
{
Direction = System.Data.ParameterDirection.Output
};
var lidParam = new SqlParameter("LivestockID", ComboBox_id.Text);
var insdParam = new SqlParameter("InseminationDate",PersianDateString.ConvertPersianDateTo10Characters(date.SelectedDate));
db.Database.ExecuteSqlCommand("InseminationChk @LivestockID,@InseminationDate,@DuplicateData out", lidParam, insdParam, dupParam);
var duplicateInsemination = (Boolean)dupParam.Value;
if (duplicateInsemination == false)
{
return true;
}
return false;
}
این تابع یک مقدار برگشتی از یک رویه ذخیره شده در sql را دریافت میکند.
و اما مشکل :
در اولین اجرا ( و تا n امین اجرا) قسمت else تابع به درستی کار نمیکند. جالب اینجاست وقتی برای خطایابی یک breakpoint گذاشتم همه چیز درست بود و بعد از اون هم با برداشتن breakpoint همه چیز درست اجرا میشه.
این کارو چندین بار انجام دادم یعنی چندین بار پایگاه داده رو خالی کردم و مجدد از صفر برنامه رو شروع کردم. تا وقتی یکبار breakpoint نذارم تابع درست اجرا نمیشه.
توضیحات تکمیلی :
رویداد ComboBox_GotFocus اتفاق میوفته، با توجه به اینکه شرط if اتفاق نمیوفته میره بخش else انجام میشه. پس تابع CheckInsemination() فراخوانی میشه. این تابع هم پارامترها رو به stored procedure میفرسته و مقدار برگشتی رو از اون دریافت میکنه. و مقدار بازگشتی به رویداد ComboBox_GotFocus ارسال میشه. تمام این فرآیند به درستی انجام میشه.
مشکل اینجاست در حالت عادی دستور داخل else انجام نمیشه. حتی اگر این روند چندین و چند بار انجام و تکرار بشه.
من وقتی دیدم این دستورات ظاهرا به درستی انجام نمیشه از breakpoint استفاده کردم دیدم تمام فرآیند و پارامترهای ارسالی و دریافتی درست هستند. و بعد از اون یک بار اجرا به واسطه breakpoint، بعدا همه چیز درست انجام میشه هر چند باری که انجام بدم.
من این چرخه رو بارها بارها تکرار کردم. (برای تکرار هر مرتبه چرخه با توجه به شرایط که باید حاصل بشه هر بار داده های پایگاه داده رو پاک میکنم) تا یک بار breakpoint نذارم و دستورات رو خط به خط با F10 جلو نبرم روند کلی درست اجرا نمیشه. یعنی تا مرحله که که تابع CheckInsemination مقدار ور برمیگردونه همه چیز درست هست و شرط داخل else رویداد ComboBox_GotFocus برقرار میشه ولی دستورات داخل else به درستی انجام نمیشه.
نمیدونم واقعا تونستم مشکل روشن کنم یا نه؟
پاسخ هوش مصنوعی
مشکل شما احتمالاً ناشی از یک مشکل در نحوه ی مدیریت زمان سنجی یا وضعیت (state management) در کد شما است. استفاده از breakpoint ممکن است که زمان اجرای دیباگر را به گونه ای تغییر دهد که وضعیت کلاس یا اشیای شما به درستی تنظیم شوند. در غیر اینصورت، می توانید روش های زیر را امتحان کنید:
1. **استفاده از `await` و `async`:** اگر تابع `CheckInsemination` شما به صورت غیر همزمان (asynchronous) اجرا می شود، اطمینان حاصل کنید که درست از `await` استفاده می کنید. در این صورت، تابع شما به صورت زیر می تواند نوشته شود:
private async void ComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (PublicVariables.LimitedDisplayMenues == false)
{
// do
}
else
{
if (await CheckInseminationAsync() == false)
{
//do
}
}
}
private async Task CheckInseminationAsync()
{
var dupParam = new SqlParameter("DuplicateData", System.Data.SqlDbType.Bit)
{
Direction = System.Data.ParameterDirection.Output
};
var lidParam = new SqlParameter("LivestockID", ComboBox_id.Text);
var insdParam = new SqlParameter("InseminationDate", PersianDateString.ConvertPersianDateTo10Characters(date.SelectedDate));
await db.Database.ExecuteSqlCommandAsync("InseminationChk @LivestockID,@InseminationDate,@DuplicateData out", lidParam, insdParam, dupParam);
var duplicateInsemination = (Boolean)dupParam.Value;
return !duplicateInsemination;
}
2. **بررسی وضعیت متغیرهای جهانی:** مطمین شوید که `PublicVariables.LimitedDisplayMenues` و دیگر متغیرهایی که استفاده می کنید به درستی تنظیم شده اند و بعد از هر تغییر به روز می شوند.
3. **اضافه کردن تأخیر (Delay):** اگر زمان اجرا در مورد دستورات مهم است، می توانید از یک تأخیر مصنوعی استفاده کنید تا بررسی کنید پیشرفت برنامه به درستی انجام می شود یا خیر.
await Task.Delay(100); // 100 milliseconds delay
این ها برخی از روش هایی هستند که می توانید آزمایش کنید تا مشکل را حل کنید. همچنین به دقت بررسی کنید که آیا دقیقاً در کجا در شرط `else` کار نمی کند و مطمین باشید که هیچ استثنایی در فرآیند اجرا نمی شود.
این مشکل از مشکلات کمیاب و عجیب هست. در این موارد نمیشه دنبال راه حل توی کدها بود. بنظرم کارهای زیر رو انجام بدید شاید نتیجه گرفتید :
- یکبار پروژه رو از Clean کنید و سپس Build کنید و تست کنید.
- فایلهای موجود در پوشه های debug و release رو حذف کنید و مجدد پروژه رو Rebuild کنید.
- یکبار Visual Studio رو ری استارت کنید و یا حتی یکبار ویندوز رو ری استارت کنید.
اگر همه این کارها رو کردید و نتیجه نگرفتید یک پروژه خالی ایجاد کنید و همین تکه کد رو ببرید توی اون پروژه خالی تست کنید.
سلام
کارهای که hamid_b گفته بود، انجام دادم و مشکل حل نشد.
به صورت ریزتر و دقیق تر بررسی کردم و حالت های مختلف و روش های مختلف ورود و ثبت اطلاعات در اون پنجره رو یک به یک بررسی کردم و بالاخره موفق به یافتن مشکل و حل اون شدم.
مشکل از منطق برنامه بود که رفع شد.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- حذف کامل یک رکورد در جدول ریلیشن شده
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- مقایسه ساختار دو دیتابیس در Sql Server
- اشکال در ایجاد کلید خارجی در Sql Server
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf