का उपयोग कर सहकारी मल्टीटास्किंग हम मॉडलिंग अनुप्रयोग को पोर्ट कर रहे हैं, जो मॉडलिंग प्रक्रिया में कस्टम क्रियाओं के लिए आयरनपीथन स्क्रिप्ट का उपयोग करता है। मौजूदा एप्लिकेशन प्रत्येक पायथन स्क्रिप्ट को अलग थ्रेड में निष्पादित करता है और इसके लिए सहकारी मॉडल का उपयोग करता है। अब हम इसे टीपीएल को बंद करना चाहते हैं, लेकिन पहले हम संदर्भ स्विचिंग को मापना चाहते हैं। असल में, क्या हम अभी:टीपीएल
Task
रों कतार- प्रत्येक
Task
इस पंक्ति से कार्यान्वित एक IronPython स्क्रिप्ट - IronPython स्क्रिप्ट के अंदर हम सी # वर्ग विधि है, जो तुल्यकालन बिंदु है और स्थानांतरित करना चाहिए के लिए कॉल
Task
(IronPython निष्पादन)
क्या हम क्या करना चाहते हैं इंतज़ार कर रहे राज्य के लिए:
- हम अनंत लूप, जो
Task
रों कतार - के माध्यम से पुनरावृति जब हम एक
Task
मिल हम इसे - PythonScript हम सी # विधि कॉल और राज्य इंतजार कर के लिए इस स्क्रिप्ट स्थानांतरित करना चाहते हैं पर अमल करने की कोशिश करेंगे बनाना चाहते हैं। लेकिन कतार से इसे हटा नहीं है।
- अगले पुनरावृत्ति पर जब हमें एक और
Task
मिलता है तो हम प्रतीक्षा स्थिति में जांचते हैं। यदि ऐसा है तो हम इसे जगाते हैं और निष्पादित करने का प्रयास करते हैं। - प्रत्येक क्षण में हम केवल एक सक्रिय
Task
- होना चाहिए और अंत में हम को मापने के लिए कितने
Task
हम प्रति सेकंड
मैं वास्तव में नहीं जानता कि यह सहकारी मल्टीटास्किंग के बारे में कुछ है पर अमल कर सकता हैं? हम कस्टम TaskScheduler
के बारे में सोच रहे हैं, क्या यह अच्छा दृष्टिकोण है? या कोई बेहतर समाधान जानता है?
धन्यवाद।
अपडेट किया गया:
ठीक है, तो उदाहरण के लिए, मैं इस तरह के कोड है:
एक_thread
टास्क निष्पादन और कार्य चलाने के लिए
_currentTask
क्षेत्र के लिए, यह भी
SleepCurrentTask
है
public class CooperativeScheduler : TaskScheduler, IDisposable
{
private BlockingCollection<Task> _tasks;
private Thread _thread;
private Task _currentTask;
public CooperativeScheduler()
{
this._tasks = new BlockingCollection<Task>();
this._thread = new Thread(() =>
{
foreach (Task task in this._tasks.GetConsumingEnumerable())
{
this._currentTask = task;
TryExecuteTask(this._currentTask);
}
}
);
this._thread.Name = "Cooperative scheduler thread";
this._thread.Start();
}
public void SleepCurrentTask()
{
if (this._currentTask != null)
{
// what to do here?
}
}
protected override IEnumerable<Task> GetScheduledTasks()
{
return this._tasks.ToArray<Task>();
}
protected override void QueueTask(Task task)
{
// No long task
this._tasks.Add(task);
}
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
throw new NotImplementedException();
}
public void Dispose()
{
this._tasks.CompleteAdding();
this._thread.Join();
}
}
कस्टम कार्य शेड्यूलर, यह है इस विधि में मैं वर्तमान कार्य निष्पादन को निलंबित करना चाहता हूं, लेकिन मुझे नहीं पता कि कैसे।
क्लाइंट कोड सरल है:
CancellationTokenSource tokenSource = new CancellationTokenSource();
Application app = Application.Create();
Task task = Task.Factory.StartNew(() =>
{
app.Scheduler.SleepCurrentTask();
},
tokenSource.Token, TaskCreationOptions.None, app.Scheduler);
}
बेहतर विचार हो सकता है कि कोई है?