×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

现学现卖:

举个简单例子:
using System.Threading;
using System.Reactive.Linq;

static Action action = () =>
{
    Console.WriteLine("Start reading From DB");
    for (int i = 0; i < 5; i++)
    {
        Console.Write(".");
        Thread.Sleep(1000);
    }

    Console.WriteLine("\nReading From DB Finished");
};

static void Main(string[] args)
{
    Console.WriteLine("main thread started");
    lab0();
    Console.WriteLine("Waiting for enter to finish the main thread");
    Console.ReadLine();
}

static void lab0()
{
    action(); // main thread will be stopped here for 5 sec.
}
运行的话主thread会被block 5秒钟,如果是图形界面,UI会死掉5秒钟。不好,换多线程
static void lab0()
{
    ThreadStart ts = new ThreadStart(action);
    Thread t = new Thread(ts);
    t.Start();
}
这样就和谐了,不过这样写起来太麻烦了,而且ThreadStart(action) 的参数必须是一个void() target,如果我想返回一些值该怎么办?一旦返回了值我还想利用这些返回值做些事情该怎么办?我相信肯定有别的繁琐的办法,但使用Rx会更美观大方一些,现在用Rx重写lab0()
static void lab0()
{
    Observable.Start(action);
}
执行效果和多线程的版本一样,没有任何区别,但是就一行话,Observable.Start()会把一个同步的线程变成异步来执行,那么如果我有返回值该怎么办?把action改写一下:
static Func<string> action = () =>
{
    Console.WriteLine("Start reading From DB");
    for (int i = 0; i < 5; i++)
    {
        Console.Write(".");
        Thread.Sleep(1000);
    }

    Console.WriteLine("\nReading From DB Finished");
    return "NASA";
};
现在action会在5秒钟后返回一个“NASA”的字符串,我想要打印这个字符串,把lab0()变一下:
static void lab0()
{
    Observable.Start(action).Subscribe(s => Console.WriteLine(s));
}
这样,Rx会异步的执行action,当action结束返回一个string的时候,Rx会把这个string当作输入参数传递给Subscribe(s => Console.WriteLine(s)); Subscribe()是一个IObservable的扩展函数(Extension Method), Observable.Start()会返回一个IObservable的对象
Report

Replies, comments and Discussions:

  • 工作学习 / 学科技术讨论 / 新的一年又开始了,想好好学习了,请大家介绍几个.net,sql的学习网站吧,就象rolia这样的最好,有人问问题,然后有人解答。谢谢,新年快乐。
    • 先自己把书看了吧,总共2800来页。
      • 大侠,这书要钱买的,挣点钱不容易,况且读书能力不行,看了后面就忘了前面了,就是想每天学点,看几个问题就行了。
        • 你要是想要,PM我,我发个电子版的给你。
          • I want it too
            • Professional C# 4 and .NET 4 + Professional Microsoft SQL Server 2008 Programming 电子版
              • 收到!
                • You are not jack of all trades, correct?
                  • at least try to portend to scare you. my B.S. was Telecommunications.
                    • Ok. Tell me how provision works.
                      • 完咧,遇到大虾了。~~~~~忘~~~~~乐~~~~~
                        • And what is the best / most employed billing system in the telco industry in North America? Are there any major or potential mergers and acquisitions in the U.S. telco market?
                          Kidding
                          • 偶输了 - 公布答案吧。
                            • Case study. Due date tomorrow.
                      • 拿自己的长处,比别人的短处。他叔,你好威风啊:)
                        • 岂敢岂敢. 小溪妹妹说她是学Telecomm 的, 我不是, 随便诌来个词儿唬唬她.
              • 谢谢。2800页,争取一天10页,一年学完,然后要求老板涨工资,然后请你吃饭。
                • 我担心这顿饭是吃不上了。到时候老板该问你:会.NET 5.0吗? 会SQL Server 2012吗?
                  • Release date?
                  • 昨天读了第一章,学习没有想象中的难,算下来三个月能学完,你等着啊。
    • 去学学.net 4.5的Rx吧,很有趣的一种语法扩展
      • 去哪学?
        • 现学现卖:
          举个简单例子:
          using System.Threading;
          using System.Reactive.Linq;
          
          static Action action = () =>
          {
              Console.WriteLine("Start reading From DB");
              for (int i = 0; i < 5; i++)
              {
                  Console.Write(".");
                  Thread.Sleep(1000);
              }
          
              Console.WriteLine("\nReading From DB Finished");
          };
          
          static void Main(string[] args)
          {
              Console.WriteLine("main thread started");
              lab0();
              Console.WriteLine("Waiting for enter to finish the main thread");
              Console.ReadLine();
          }
          
          static void lab0()
          {
              action(); // main thread will be stopped here for 5 sec.
          }
          
          运行的话主thread会被block 5秒钟,如果是图形界面,UI会死掉5秒钟。不好,换多线程
          static void lab0()
          {
              ThreadStart ts = new ThreadStart(action);
              Thread t = new Thread(ts);
              t.Start();
          }
          
          这样就和谐了,不过这样写起来太麻烦了,而且ThreadStart(action) 的参数必须是一个void() target,如果我想返回一些值该怎么办?一旦返回了值我还想利用这些返回值做些事情该怎么办?我相信肯定有别的繁琐的办法,但使用Rx会更美观大方一些,现在用Rx重写lab0()
          static void lab0()
          {
              Observable.Start(action);
          }
          
          执行效果和多线程的版本一样,没有任何区别,但是就一行话,Observable.Start()会把一个同步的线程变成异步来执行,那么如果我有返回值该怎么办?把action改写一下:
          static Func<string> action = () =>
          {
              Console.WriteLine("Start reading From DB");
              for (int i = 0; i < 5; i++)
              {
                  Console.Write(".");
                  Thread.Sleep(1000);
              }
          
              Console.WriteLine("\nReading From DB Finished");
              return "NASA";
          };
          
          现在action会在5秒钟后返回一个“NASA”的字符串,我想要打印这个字符串,把lab0()变一下:
          static void lab0()
          {
              Observable.Start(action).Subscribe(s => Console.WriteLine(s));
          }
          
          这样,Rx会异步的执行action,当action结束返回一个string的时候,Rx会把这个string当作输入参数传递给Subscribe(s => Console.WriteLine(s)); Subscribe()是一个IObservable的扩展函数(Extension Method), Observable.Start()会返回一个IObservable的对象
      • I have a feeling that Rx is a very good stuff for smartphone. Hope windows phone system can recover in near future.
        • 这玩意看起来很美,但是实际用起来还没有找到感觉,现在仍然处于磨合期,俺在项目中用了一些Rx技术,没想到做Code Review 的时候 Team Lead看不懂,建议我改回传统方法