मैं अपनी परियोजना के लिए धागे के साथ परीक्षण कर रहा हूँ। परीक्षण करते समय, मुझे पता चलता है कि हम थ्रेड्स में वेरिएबल असाइन नहीं कर सकते हैं। उसके बाद मुझे एक समाधान मिला: Interlocked वर्ग का उपयोग करना।

मैंने int के साथ इसका परीक्षण किया, यह वास्तव में अच्छी तरह से काम करता है। लेकिन जैसे ही मैं इसे कक्षा में बदलता हूं, यह मुझे फेंक देता है:

NullReferenceException: ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट की आवृत्ति पर सेट नहीं है।

मैं आउटपुट में "क्लास" के साथ एक लाइन की उम्मीद कर रहा था।

क्या कोई मुझे समझा सकता है कि यहाँ क्या हो रहा है?

कोड (यह मानते हुए कि कोड Program वर्ग में है और आवश्यक प्रत्येक नामस्थान घोषित किया गया है):

static Class i;

static void Main(string[] args)
{
    Thread thread = new Thread(new ThreadStart(ModThread));
    thread.Start();

    Console.WriteLine(i.ToString());
    Console.ReadKey();
}

static void ModThread ()
{
    Interlocked.Exchange(ref i, new Class());
}

class Class { }
1
Triet Vo Nguyen Minh 25 जिंदा 2020, 10:42

1 उत्तर

सबसे बढ़िया उत्तर

आदिम मूल्य कभी शून्य नहीं होते हैं। उनके पास कुछ डिफ़ॉल्ट मान है।

जिन वर्गों को प्रारंभ नहीं किया गया है वे शून्य हो सकते हैं। तो इस लाइन में

Interlocked.Exchange(ref i, new Class());

आपका रेफरी शून्य है क्योंकि मैं यहां प्रारंभ नहीं किया गया है: static Class i;

static Class i = new Class(); के साथ अपना कोड आज़माएं

दस्तावेज़ यहाँ देखें: https: //docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.exchange?view=netframework-4.8

public static object Exchange (ref object location1, object value);

अपवाद ArgumentNullException स्थान 1 का पता एक शून्य सूचक है।

1 संपादित करें

अपडेट किए गए मान को देखने के लिए, मुख्य थ्रेड को थोड़ी देर के लिए सुलाएं और फिर परिणाम प्रिंट करें।

    thread.Start();
    Thread.Sleep(100);

जब आप थ्रेड का उपयोग कर रहे हों तो आप निष्पादन आदेश को नियंत्रित नहीं कर सकते। तो क्या होता है:

  1. दूसरा सूत्र शुरू करने के लिए कहा गया है
  2. पहला धागा वर्तमान मूल्य को प्रिंट करता है
  3. दूसरा धागा मूल्य की प्रतिलिपि बनाता है

स्लीप कमांड के साथ, हम पहले थ्रेड को थोड़ा इंतजार करने के लिए कहते हैं ताकि दूसरा पहले वाले WriteLine से पहले मान को बदल सके।

2
Athanasios Kataras 25 जिंदा 2020, 11:30