مشكلة في الوصول إلى الملف من موضوع مختلف في Asp.net

StackOverflow https://stackoverflow.com/questions/120404

سؤال

لدي عملية في موقع ويب (Asp.net 3.5 باستخدام Linq-to-Sql للوصول إلى البيانات) تحتاج إلى العمل على النحو التالي:

  1. رفع ملف
  2. تسجيل وحفظ المعلومات المتعلقة بالملف إلى قاعدة البيانات
  3. استيراد البيانات من الملف إلى قاعدة البيانات
  4. إعادة التوجيه إلى صفحة مختلفة

عند التشغيل بالتتابع بهذه الطريقة، كل شيء يعمل بشكل جيد.ومع ذلك، نظرًا لأن الملفات التي يتم استيرادها يمكن أن تكون كبيرة جدًا، أرغب في تشغيل الخطوة 3 على سلسلة رسائل مختلفة عن سلسلة رسائل واجهة المستخدم.يجب أن يصل المستخدم إلى الخطوة 4 بينما لا تزال الخطوة 3 قيد التقدم، وسيتم تحديث الشاشة في الخطوة 4 بشكل دوري لإعلام المستخدم عند اكتمال الاستيراد.

أنا أتعامل مع الخيوط على النحو التالي:

public class Import {

  public static void ImportPendingFile() {
    Import i = new Import();
    Thread newThread = new Thread(new ThreadStart(i.ImportFile));
    newThread.Start();
  }

  public void ImportFile() {
    // 1. Query DB to identify pending file
    // 2. Open up and parse pending file
    // 3. Import all data from file into DB
    // 4. Update db to reflect that import completed successfully
  }
}

وفي الكود الخلفي:

protected void butUpload(object sender, EventArgs e) {
  // Save file, prepare for import
  Import.ImportPendingFile();
  Response.Redirect(NewLocation);
}

عند القيام بذلك، أستطيع أن أؤكد عبر مصحح الأخطاء أن سلسلة الرسائل الجديدة تبدأ بشكل صحيح.ومع ذلك، عندما أفعل ذلك، يتم إحباط الخيط عند محاولة الوصول إلى الملف (الخطوة 2 في الكود الموجود خلفه).يعمل هذا بشكل جيد عند تشغيله في سلسلة المحادثات الرئيسية، لذا هناك شيء ما حول الوضع متعدد الخيوط يمنع ذلك.لقد اعتقدت أنه نظرًا لأنه تم حفظ الملف على القرص (وهو كذلك) فلن تكون هناك أي مشكلة في فتحه في موضوع مختلف.أي أفكار أين أخطأت وكيف يمكنني إصلاحها؟شكرًا!

ملحوظة:أنا أستخدم تجميعًا لجهة خارجية لفتح الملف.باستخدام العاكس، وجدت الكود التالي المتعلق بكيفية فتح الملف:

if (File.Exists(fileName)) {
  using (FileStream stream = new FileStream(fileName, FileMode.Open)) {
    // use stream to open file
  }
}
هل كانت مفيدة؟

المحلول

جرب Response.Redirect(url, false) وإلا ستنتهي "الاستجابة" بعد تلك المكالمة مباشرة.

نصائح أخرى

تعد حالة عرض ASP.NET ميزة رائعة وأداة أساسية لتطوير الويب اليوم.فهو يحافظ على حالة الصفحة أثناء انتقالها ذهابًا وإيابًا.لم تعد هناك حاجة للقلق بشأن استعادة قيم عناصر التحكم في الصفحة بين عمليات إعادة النشر.في هذه المقالة سوف تحصل على منظور متعمق لحالة العرض.سنتحدث عن طرق تقليل الحمولة غير الضرورية وحماية حالة العرض من أعين المتطفلين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top