سؤال

أقوم بتطوير تطبيق WPF Windows وأواجه مشكلة في تشغيل التطبيق في .NET 3.0. في كل مرة أحاول فيها الوصول إلى System.Windows.Threading.Dispatcher.invoke () ، أحصل على خطأ في الأسلوب.

في الأساس ، أفرز مؤشر ترابط جديد من مؤشر الترابط الرئيسي وأحاول تغيير بعض خصائص واجهة المستخدم (تحديث شريط التقدم بشكل أساسي) من مؤشر الترابط الجديد باستخدام الكود التالي:

updateStatusDelegate usd = new updateStatusDelegate(progressBar.SetValue);
Dispatcher.Invoke(usd, System.Windows.Threading.DispatcherPriority.Background, new object[] { System.Windows.Controls.ProgressBar.ValueProperty, Convert.ToDouble(perc) });

هل يمكن لأحد أن يساعدني في فهم لماذا أواجه هذا الخطأ في إصدار .NET 3.0؟ أنا قادر على الحصول على هذا في .NET 3.0 SP2. لكنني أعتقد أن .NET لم يتم توزيعه بشكل مستقل ويتم تعبئته فقط باستخدام إصدار .NET 3.5. هدفي هو الابتعاد عن تبعية .NET 3.5 والحصول على تبعية على .NET 3.0 إصدار

سيكون موضع تقدير أي مساعدة.

شكرًا

كابيل

هل كانت مفيدة؟

المحلول

كان هناك قدر لا بأس به من التدفق في فئات WPF. لاحظ التعليق التوضيحي "المدعوم في" في أسفل مقالة مكتبة MSDN لهذه الطريقة. ستحتاج إلى تثبيت .NET 3.0 SP1 على الأقل على هذا الجهاز ، حزمة الخدمة التي تم إصدارها في نفس الوقت .NET 3.5.

لا توجد طريقة جيدة للتحقق من ذلك ، لم يتغير [AssemblyVersion]. تم تنفيذ هذا من خلال الاعتماد على Windows Update تلقائيًا ترقية إصدار .NET. إذا قام عميلك بحظر هذه التحديثات ، فسيتعين عليك إعداد جهاز اختبار يحتوي على إصدار .NET 3.0 الأصلي.

الحل البديل بسيط بما فيه الكفاية ، بمجرد العثور عليها ، استخدم تحميلًا زائد متاح في 3.0 RTM. سيكون من الحكمة أن مطالبة العميل بنشر 3.5 SP1.

نصائح أخرى

جرب هذا:

updateStatusDelegate usd = new updateStatusDelegate(progressBar.SetValue);
Dispatcher.CurrentDispatcher.Invoke(
    usd, 
    DispatcherPriority.Background, 
    new object[] { ProgressBar.ValueProperty, Convert.ToDouble(perc) });

الاحتجاج ليس طريقة ثابتة. يجب أن تسميها على مثيل من الفصل. يمكنك استخدام الخاصية الثابتة Dispatcher.CurrentDispatcher للحصول على (أو إنشاء) المرسل المرتبط بالخيط الحالي.

(راجع للشغل ، أنت غير صحيح أن هذا سيعمل مع إصدار مختلف من الإطار.)


لقد أخذت البرنامج التالي (كل شيء في mainwindow.xaml.cs):

public partial class MainWindow : Window
{
    private string perc = ".25";

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        updateStatusDelegate usd = new updateStatusDelegate(
            progressBar.SetValue);
        Dispatcher.Invoke(usd, 
            System.Windows.Threading.DispatcherPriority.Background, 
            new object[] { 
                System.Windows.Controls.ProgressBar.ValueProperty, 
                Convert.ToDouble(perc) });

        var dbl = Convert.ToDouble(perc);
        perc = (dbl + .1).ToString();
    }
}
public delegate void updateStatusDelegate(DependencyProperty dp, object value);

وقم بتشغيله لاستهداف 3.0 و 3.5 (SP1) و 4.0. إنه يعمل على كل إصدار.

هذا يقودني إلى ثلاث استنتاجات. أولاً ، قد لا يكون PERC سلسلة وتحويله. لا يحتوي todouble على تحميل زائد لتحويل النوع الذي هو عليه بالفعل. ثانياً ، يتم حذف كمبيوتر المستخدم ويحتاج إلى تنظيف جيد (امسح ، إعادة التثبيت). ثالثًا ، مشكلتك في مكان آخر وأنت فكر في هذا هو المكان الذي تحصل فيه على الاستثناء ، ولكن في الواقع هو مكان آخر.

اكتشف أن الطريقة التي كنت أستخدمها لم يتم دعمها في .NET الإصدار 3.0 (مدعوم فقط في .NET 3.0SP2 فصاعدًا)

http://msdn.microsoft.com/en-us/library/cc647499٪28vs.90٪29.aspx

لذا ، الآن بعد أن أستخدم طريقة أخرى تم تحميلها على الاستدعاء والتي تعمل بشكل جيد في .NET 3.0 ، يمكنني حل هذه المشكلة.

شكرا ، كابيل

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