九一八事变后张学良本还有机会翻盘重新夺回东
分类:技术

九一八事变,又称沈阳事变、奉天事变、盛京事变、满洲事变、柳条湖事变等,是指1931年9月18日在中国东北爆发的一次军事冲突和政治事件。冲突双方是中国东北军和日本关东军,日本军队以中国军队炸毁日本修筑的南满铁路为借口而占领沈阳。事变爆发后,日本与中国之间矛盾激化,而日本军部主战派地位上升,国会和内阁总理大臣权力下降,导致日本全面侵华。几年时间内,东北三省全部被日本关东军占领。9月18日被中华人民共和国政府视为国耻日。

如何:对 Windows 窗体控件进行线程安全调用

                            01

日本一直觊觎东北

访问 Windows 窗体控件本质上不是线程安全的。 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。 还可能会出现其他与线程相关的 Bug,例如争用情况和死锁。 确保以线程安全方式访问控件非常重要。

昨天,我和同事L一起吃饭的时候,她突然问了一个问题,让我不知道怎么回答,而且到现在我还是没有想到答案。

1905

在未使用 Invoke.aspx) 方法的情况下,从不是创建某个控件的线程的其他线程调用该控件是不安全的。 以下非线程安全的调用的示例。

她说:现在公司招人越来越偏年轻化了,我们以后年纪大了想换个工作,或者找一个让自己满意的工作到时候肯定会很难。我们又不像咱公司的某老总一样拥有丰富的人脉关系,“越老越吃香”。退一步说,我们能工作到退休,除了依靠养老金,如何才能依靠自己在这个城市里面很好地生活下去?

年,日本在日俄战争中胜利,取得中国旅顺、大连等地的租借权和长春-旅顺的铁路(也就是所谓的南满铁路)及附属设施。随后,日本成立“南满洲铁道株式会社”,负责南满铁路的经营和管理。不久,日本又将辽东半岛改名关东州,在旅顺设立关东都督府,下设民政部和陆军部。1919年日本在关东都督府陆军部的基础上,成立关东军司令部,下辖1个师团、6个独立守备大队、旅顺重炮大队和宪兵队等部队,主要就是保护日本在辽东半岛的殖民权益以及南满铁路的设备。

        // This event handler creates a thread that calls a 
        // Windows Forms control in an unsafe way.
        private void setTextUnsafeBtn_Click(
            object sender, 
            EventArgs e)
        {
            this.demoThread = 
                new Thread(new ThreadStart(this.ThreadProcUnsafe));
            this.demoThread.Start();
        }
        // This method is executed on the worker thread and makes
        // an unsafe call on the TextBox control.
        private void ThreadProcUnsafe()
        {
            this.textBox1.Text = "This text was set unsafely.";
        }

说实话,我一个二十多岁的小青年,一直都觉得自己很年轻,正当花季,正是“肆意”的时候,年老离我还很遥远很遥远,所以我没有想过那么多。

1927

.NET Framework 可帮助您检测以非线程安全方式访问控件这一问题。 在调试器中运行应用程序时,如果一个不是创建某个控件的线程的其他线程调用该控件,则调试器会引发一个 InvalidOperationException.aspx),并显示以下消息:“从不是创建控件控件名称 的线程访问它。”

她问我的时候,我是懵的,是迷茫的。                                  02

年6月,时任日本首相的田中义一主持召开“东方会议”,确立了“把满洲从中国本土分裂出来,自成一区,置日本势力之下”的侵略方针,并提出臭名昭著的《对华政策纲要》(即田中奏折):“欲征服中国,必先征服满蒙欲征服世界,必先征服中国”,对东北地区的侵略野心已经是昭然若揭。

此异常在调试期间和运行时的某些情况下可靠地发生。 在调试以 .NET Framework 2.0 版之前的 .NET Framework 编写的应用程序时,可能会出现此异常。 我们强烈建议您在发现此问题时进行修复,但您可以通过将 CheckForIllegalCrossThreadCalls.aspx) 属性设置为 false 来禁用它。(不推荐)

晚上回到住的地方以后,我开始思考这个问题。

东北军阀张作霖早年曾与日本有过合作关系,但他在借助日本势力的支持下统一东北后,反而开始反对日本在东北的渗透,因此日本关东军于1928年6月发起皇姑屯事件,将张作霖乘坐的列车炸毁,张作霖重伤不治身亡。


现在如果有人问我同样的问题,我可能会给出这样的答案。

日本希望造成东北群龙无首的局面,借机染指东北。但张作霖的儿子张学良不但很快控制住了局面,并在1928年12月29日宣布服从南京国民政府,改用南京政府的青天白日旗,史称“东北易帜”。至此,北洋军阀在中国的历史宣告结束,南京国民政府在形式上“统一”了全国。

对 Windows 窗体控件进行线程安全调用

  1. 查询控件的 InvokeRequired.aspx) 属性。

  2. 如果 InvokeRequired.aspx) 返回 true,则使用实际调用控件的委托来调用 Invoke.aspx)。

  3. 如果 InvokeRequired.aspx) 返回 false,则直接调用控件。

  在下面的代码示例中,将在由后台线程执行的 ThreadProcSafe 方法中实现线程安全调用。 如果 TextBox.aspx) 控件的 InvokeRequired.aspx) 返回 true,则 ThreadProcSafe 方法会创建 SetTextCallback 的一个实例,并将该实例传递给窗体的 Invoke.aspx) 方法。 这使得 SetText 方法被创建 TextBox.aspx) 控件的线程调用,而且在此线程上下文中将直接设置 Text.aspx) 属性。

       // This event handler creates a thread that calls a 
        // Windows Forms control in a thread-safe way.
        private void setTextSafeBtn_Click(
            object sender, 
            EventArgs e)
        {
               this.demoThread = 
               new Thread(new ThreadStart(this.ThreadProcSafe));
               this.demoThread.Start();
        }

        // This method is executed on the worker thread and makes
        // a thread-safe call on the TextBox control.
        private void ThreadProcSafe()
        {
            this.SetText("This text was set safely.");
        }

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace CrossThreadDemo
{
    public class Form1 : Form
    {
        // This delegate enables asynchronous calls for setting
        // the text property on a TextBox control.
        delegate void SetTextCallback(string text);

        // This thread is used to demonstrate both thread-safe and
        // unsafe ways to call a Windows Forms control.
        private Thread demoThread = null;

        // This BackgroundWorker is used to demonstrate the 
        // preferred way of performing asynchronous operations.
        private BackgroundWorker backgroundWorker1;

        private TextBox textBox1;
        private Button setTextUnsafeBtn;
        private Button setTextSafeBtn;
        private Button setTextBackgroundWorkerBtn;

        private System.ComponentModel.IContainer components = null;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        // This event handler creates a thread that calls a 
        // Windows Forms control in an unsafe way.
        private void setTextUnsafeBtn_Click(
            object sender, 
            EventArgs e)
        {
            this.demoThread = 
                new Thread(new ThreadStart(this.ThreadProcUnsafe));

            this.demoThread.Start();
        }

        // This method is executed on the worker thread and makes
        // an unsafe call on the TextBox control.
        private void ThreadProcUnsafe()
        {
            this.textBox1.Text = "This text was set unsafely.";
        }

        // This event handler creates a thread that calls a 
        // Windows Forms control in a thread-safe way.
        private void setTextSafeBtn_Click(
            object sender, 
            EventArgs e)
        {
            this.demoThread = 
                new Thread(new ThreadStart(this.ThreadProcSafe));

            this.demoThread.Start();
        }

        // This method is executed on the worker thread and makes
        // a thread-safe call on the TextBox control.
        private void ThreadProcSafe()
        {
            this.SetText("This text was set safely.");
        }

        // This method demonstrates a pattern for making thread-safe
        // calls on a Windows Forms control. 
        //
        // If the calling thread is different from the thread that
        // created the TextBox control, this method creates a
        // SetTextCallback and calls itself asynchronously using the
        // Invoke method.
        //
        // If the calling thread is the same as the thread that created
        // the TextBox control, the Text property is set directly. 

        private void SetText(string text)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.textBox1.InvokeRequired)
            {    
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.textBox1.Text = text;
            }
        }

        // This event handler starts the form's 
        // BackgroundWorker by calling RunWorkerAsync.
        //
        // The Text property of the TextBox control is set
        // when the BackgroundWorker raises the RunWorkerCompleted
        // event.
        private void setTextBackgroundWorkerBtn_Click(
            object sender, 
            EventArgs e)
        {
            this.backgroundWorker1.RunWorkerAsync();
        }

        // This event handler sets the Text property of the TextBox
        // control. It is called on the thread that created the 
        // TextBox control, so the call is thread-safe.
        //
        // BackgroundWorker is the preferred way to perform asynchronous
        // operations.

        private void backgroundWorker1_RunWorkerCompleted(
            object sender, 
            RunWorkerCompletedEventArgs e)
        {
            this.textBox1.Text = 
                "This text was set safely by BackgroundWorker.";
        }

        #region Windows Form Designer generated code

        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.setTextUnsafeBtn = new System.Windows.Forms.Button();
            this.setTextSafeBtn = new System.Windows.Forms.Button();
            this.setTextBackgroundWorkerBtn = new System.Windows.Forms.Button();
            this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(12, 12);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(240, 20);
            this.textBox1.TabIndex = 0;
            // 
            // setTextUnsafeBtn
            // 
            this.setTextUnsafeBtn.Location = new System.Drawing.Point(15, 55);
            this.setTextUnsafeBtn.Name = "setTextUnsafeBtn";
            this.setTextUnsafeBtn.TabIndex = 1;
            this.setTextUnsafeBtn.Text = "Unsafe Call";
            this.setTextUnsafeBtn.Click += new System.EventHandler(this.setTextUnsafeBtn_Click);
            // 
            // setTextSafeBtn
            // 
            this.setTextSafeBtn.Location = new System.Drawing.Point(96, 55);
            this.setTextSafeBtn.Name = "setTextSafeBtn";
            this.setTextSafeBtn.TabIndex = 2;
            this.setTextSafeBtn.Text = "Safe Call";
            this.setTextSafeBtn.Click += new System.EventHandler(this.setTextSafeBtn_Click);
            // 
            // setTextBackgroundWorkerBtn
            // 
            this.setTextBackgroundWorkerBtn.Location = new System.Drawing.Point(177, 55);
            this.setTextBackgroundWorkerBtn.Name = "setTextBackgroundWorkerBtn";
            this.setTextBackgroundWorkerBtn.TabIndex = 3;
            this.setTextBackgroundWorkerBtn.Text = "Safe BW Call";
            this.setTextBackgroundWorkerBtn.Click += new System.EventHandler(this.setTextBackgroundWorkerBtn_Click);
            // 
            // backgroundWorker1
            // 
            this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(268, 96);
            this.Controls.Add(this.setTextBackgroundWorkerBtn);
            this.Controls.Add(this.setTextSafeBtn);
            this.Controls.Add(this.setTextUnsafeBtn);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion


        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }

    }
}

 

 

首先,我们要有一个健康的身体。在年轻的时候好好锻炼身体,增强体质。一个健康的身体才是我们将来做任何事的基础;而且我常常觉得一个人不生病或者很少生病的话,其实在一定程度上就是赚到了。

随后,张学良进一步对日本采取不合作的态度,特别是在南满铁路附近建设新的铁路,并以低廉的价格与南满铁路竞争,使南满铁路陷入经营危机。这些引起日本关东军的强烈不满,甚至开始考虑采取军事行动来确保在东北的特权。

其次,要学会合理理财,实现效益最大化。如今这个时代,越来越多的年轻人都是月光族,挣多少花多少,甚至花的比挣的多少,这样长此以往下去,也不知道他们会不会为自己的未来感到担忧呢?万一发生一点儿意外情况急需用钱怎么办呢?所以,现在学会合理理财对年老以后的生活是有利无害的。有个段子是:何以解忧,唯有暴富。但仔细考虑了一下,无论是买彩票还是嫁个有钱的老公一夜暴富,这样的概率都太小了,还不如靠自己,好好学学如何投资呢。

1929

最后是掌握一门其它的技能。俗话说,技不压身。在年轻的时候多掌握一门能够养活自己的技能,年老的时候我们也许能有更多的选择也说不定啊。当然了,掌握一门技能,并不是说,你心血来潮去学了几天画画、书法或者舞蹈等等,你就掌握了这份技能,这应该不能称之为你的一项技能吧?所以,这里我们应该好好想想什么是“掌握”,什么是“技能”,我们到底有没有决心和毅力“掌握这份技能”?

年,美国爆发有史以来最严重的经济危机,并迅速波及全世界,日本经济也受到很大的影响。到1931年,日本经济已经陷入极端困难的境地,并引起政治危机。在内外交困情况下,日本法西斯势力便策划冲破第一次世界大战结束后所形成的华盛顿体系对日本的束缚,发动一场对外战争,既可以转移国内矛盾,又可以得到资源和市场的战争红利,中国东北自然就是最理想的目标。

这个答案也许不是很完美,但是这是我现在所能想到的;同时也是我希望自己能够逐步实现的。

张学良本来可以翻盘,然而……

                              03

1931

有人问,你才二十多岁,更应该好好考虑当下,现在就开始想年老以后的事,会不会想的太多了。

年9月18日深夜22时20分左右,日本关东军铁路守备队柳条湖分遣队在奉天(今沈阳)北面约7500米处的南满铁路柳条湖段引爆炸药,炸毁了一小段铁路,并将3具身穿东北军士兵服装的中国人尸体放在现场,诬称中国军队破坏南满铁路并袭击日军守备队,并以此为借口,进攻中国军队驻地北大营。

我不认为我想的太多。享受当下和放眼未来并不是一件矛盾的事。对我而言,放眼未来是可以让我当下更加有动力,更加努力。

坐镇沈阳的东北边防军司令长官公署中将参谋长荣臻根据张学良的指示,命令东北军“不准抵抗”。因此北大营的8000名守军竟被只有300人的日军击溃。同时,关东军第2师团第3旅团第29联队进攻奉天,至9月19目10时,日军先后攻占奉天、四平、营口、凤凰城、安东等18座城镇。

所以,老有所依,依什么?依自己,现在的自己!

图片来自网络

本文由奥门金沙网址发布于技术,转载请注明出处:九一八事变后张学良本还有机会翻盘重新夺回东

上一篇:留学中的那些坑,千页计划 下一篇:没有了
猜你喜欢
热门排行
精彩图文