好吧,我无法正确理解多线程场景.很抱歉再次提出类似的问题,我只是在互联网上看到许多不同的"事实".
public static class MyClass {
private static List<string> _myList = new List<string>;
private static bool _record;
public static void StartRecording()
{
_myList.Clear();
_record = true;
}
public static IEnumerable<string> StopRecording()
{
_record = false;
// Return a Read-Only copy of the list data
var result = new List<string>(_myList).AsReadOnly();
_myList.Clear();
return result;
}
public static void DoSomething()
{
if(_record) _myList.Add("Test");
// More, but unrelated actions
}
}
Run Code Online (Sandbox Code Playgroud)
想法是,如果激活录制,则对DoSomething()的调用将记录在内部List中,并在调用StopRecording()时返回.
我的规格是这样的:
通常的方式似乎是:
public static void DoSomething()
{
object _lock …Run Code Online (Sandbox Code Playgroud) void WorkHandler::addWork(Work* w){
printf("WorkHandler::insertWork Thread, insertWork locking \n");
lock();
printf("WorkHandler::insertWork Locked, and inserting into queue \n");
m_workQueue.push(w);
signal();
unLock();
}
Run Code Online (Sandbox Code Playgroud)
我按照教程,得到了这个.我想知道是否可以像这样更改singal()和unLock()的顺序
void WorkHandler::addWork(Work* w){
printf("WorkHandler::insertWork Thread, insertWork locking \n");
lock();
printf("WorkHandler::insertWork Locked, and inserting into queue \n");
m_workQueue.push(w);
unLock();
signal();
}
Run Code Online (Sandbox Code Playgroud)
如果我不能这样做,你能否详细说明为什么我不允许这样做?提前致谢.
我正在研究构建在.NET 3.5之上的遗留应用程序.这是一个我无法改变的约束.我需要执行第二个线程来运行长时间运行的任务而不锁定UI.线程完成后,我需要以某种方式执行回调.
现在我尝试了这个伪代码:
Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it's done
_thread.Join();
// execute finalizer
Run Code Online (Sandbox Code Playgroud)
第二个选项不锁定UI,如下所示:
Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it's done
while(_thread.IsAlive)
{
Application.DoEvents();
Thread.Sleep(100);
}
// execute finalizer
Run Code Online (Sandbox Code Playgroud)
当然第二种解决方案并不好,因为它会过度充电._thread完成后执行回调的正确方法是什么?另外,我如何知道线程是否被取消或中止?
*注意:*我无法使用BackgroundWorker,我无法使用Async库,我需要使用本机线程类.