�A�ځFReactive Extensions�iRx�j����

��1��@Reactive Extensions�̊T�v�Ɨ��p���@

�͍� �X��
2011/11/01

Page1 Page2

�@C# 3.0��蓱������A�v���O���~���O�E�X�^�C���ɑ傫�ȕϊv�������炵��LINQ�͂��������낤���B�ڂ����́u���W�FRoad to LINQ�v�ŏЉ��Ă��邪�A�f�[�^���H�ɂ����鏈���̎�Ԃ�傫������������̂ł���BLINQ�̓����Ƃ��āA�e��̃f�[�^�\�[�X�i���z���XML�f�[�^�ASQL�f�[�^�x�[�X�Ȃǁj�ɑ΂��ē���I�ȋL�@��񋟂��邱�Ƃ���������B

�@Reactive Extensions�i�ȍ~�ARx�j�́ALINQ���K�p�ł���f�[�^�\�[�X�̊T�O���u�񓯊��v�Ɓu�C�x���g�v�ɍL�����A����΁uLINQ to Asynchronous�v�uLINQ to Events�v�Ƃł������ׂ����̂ł���B����ɂ��A�]���ł͎�Ԃ̂����������G�Ȕ񓯊�������C�x���g�����A���Ԃ��֌W���鏈���Ȃǂ��ALINQ�̌`�ŁA�ȒP�ɁA�錾�I�ɋL�q�ł���悤�ɂȂ�B

�@Rx�����p�ł���v���b�g�t�H�[���́A

  • .NET Framework 3.5
  • .NET Framework 4.0 Client Profile
  • Silverlight 3
  • Silverlight 4
  • Windows Phone 7
  • XNA 4.0

�Ƒ���ɓn��B���ɁA�ʐM�ɔ񓯊�API�����񋟂���Ă��Ȃ�Silverlight��Windows Phone 7�ő傫�ȗ͂𔭊����邾�낤�B�܂��AJavaScript�����ɂ́uRxJS�v�Ƃ������C�u�������ʓr�A�p�ӂ���Ă���A����𒴂����d�g�݂Ƃ��āAJavaScript��ł�.NET Framework�p�Ɠ����悤�ɁARx�̔񓯊���C�x���g�����ɑ΂��鋭�͂ȋ@�\���g�����Ƃ��”\���B

��Reactive Extensions�iRx�j�̗��j

�@Rx�́A2009�N11��18���ɁA�}�C�N���\�t�g�̊J�����储���Microsoft Research�̎����I�ȃv���W�F�N�g�����J����|�[�^���E�T�C�g�uMicrosoft DevLabs�v�ɂăy�[�W���J�݂���A���̌�A1�N���ɓn��ׂ��������I�ȃ����[�X���������Ă����BDevLabs�̎����I�ȃv���W�F�N�g�́A�����Ȑ��i�ɏ��i������̂�����΁A�ŏI�I�ɂ͑ł��؂��Ă��܂����̂�����*1�BRx�́A2011�N1��21���ɁA�����Ȑ��i�Ƃ��ĔF�߂��A�ȍ~�A�v���W�F�N�g�̃y�[�W��*2Data Developer Center�ւƈڍs�����B�܂��A�����v���W�F�N�g���i�ȑO�ɂ́ARx�ł̎�v�ȃC���^�[�t�F�C�X�ł���IObservable<T>��IObserver<T>��.NET Framework 4�^Silverlight 4�ɂ��łɓ����Ă���ق��AWindows Phone 7 SDK��Microsoft.Phone.Reactive���O��ԂƂ��ĕW���Ń��C�u���������ڂ���Ă����B

�@�C���^�[�t�F�C�X�����ł�.NET�̃N���X�E���C�u�����ɓ��ڂ���Ă��邱�ƁAWindows Phone 7�ɕW�����ڂ���Ă��邱�ƂȂǂ���A�u.NET Framework 4.5�ɓ��ڂ����̂ł́H�I�v�Ƃ������҂�������Ă��邪�A���݁ADeveloper Preview�Ƃ��Č��J����Ă���Visual Studio 11�ɓ�������Ă���.NET Framework 4.5�ɂ�Rx�͓����Ă��Ȃ��B�Ƃ͂����ADevLabs�ł̎����I�v���W�F�N�g�ł͂Ȃ��A�����ȃv���W�F�N�g�ł��邽�߁A�J����T�|�[�g���ł��؂��邱�Ƃ͂Ȃ��̂ŁA���S���ė��p���Ă����B

*1�@�ł��؂�ꂽ���̂ł�STM.NET�ȂǁA�����Ȑ��i�ƂȂ������̂ɂ�Small Basic�Ȃǂ���������B
*2�@Data Developer Center�́A�����ja-jp�ŃA�N�Z�X����Ɓu�f�[�^ �A�N�Z�X �f�x���b�p�[ �Z���^�[�v�Ƃ��āAen-us�Ƃ͂܂������قȂ���{��p�̃y�[�W���\������邪�Aja-jp�̃y�[�W�ł́A���݂̂Ƃ���ARx�Ɋւ���y�[�W�ɂ̓A�N�Z�X�ł��Ȃ��B

��Reactive Extensions�iRx�j���”\�ɂ��邱��

�@Rx�̈�������e�͑���ɓn��B�ŏ��ɏq�ׂ��悤�ɔ񓯊��ƃC�x���g���ł�����̂����A�ق��ɂ����Ԃ�ALINQ to Objects�ň����ʏ�̃R���N�V�����i��IEnumerable<T>�C���^�[�t�F�C�X�����������I�u�W�F�N�g�j���������Ƃ��”\���B

�@�Ȃ����̂悤�Ȃ��Ƃ��”\�Ȃ̂��Ƃ����ƁA�Ⴆ��MouseClick�C�x���g���v�������ׂĂق����B�}�E�X���N���b�N����A����1�b��Ƀ}�E�X���N���b�N����A����3�b��Ƀ}�E�X���N���b�N����B�N���b�N�̂��т�MouseEventArgs�I�u�W�F�N�g�ɂ���āA�N���b�N���ꂽ���W�Ȃǂ̒l�����s�����B����͎��ԂƂ����������̏�ɒl����������Ă���A�ƌ��邱�Ƃ��ł���B

�@�ł͎��Ԃ��̂��́A�Ⴆ��Timer�C�x���g�͂ǂ����낤���B����́A�w�肳�ꂽ���ԊԊu�ŁA�C�x���g�����s����Ă���ƌ��邱�Ƃ��ł���B

�@�񓯊������͂ǂ����낤���H ���̏ꍇ�́A���鎞�Ԃɂ���ď����̊J�n���x������A�������I�������Ƃ��ɒl�����s�����A�ƌ��邱�Ƃ��ł���B

�@�z��͂ǂ����낤�H ���̏ꍇ�ł��A��u�̂����A�Ⴆ��0.0000001�b�Ԋu�Œl�����s�����ƍl���邱�Ƃ��”\�Ȃ̂��B

�@������}�ɂ܂Ƃ߂�ƁA���̂悤�ɂȂ�B

�C�x���g�^�񓯊��^�z�񂪓������Ԏ��ɏ��C���[�W�}

�@Rx�͂��܂��܂Ȓl���A���Ԏ��ɏ��񓯊��ȃX�g���[���ƍl���邱�Ƃɂ��A�����ɏ悹���邷�ׂĂ̒l�𓙂���LINQ���Z�q�ɂ���Ďˉe�E���o�E�������邱�Ƃ��”\�ɂ����̂ł���B

��LINQ�ł���Ƃ�������

�@Rx�̍��{���x����C���^�[�t�F�C�X��IObservable<T>���B����́A�]���ALINQ�Ŏg���Ă���C���^�[�t�F�C�X��IEnumerable<T>�ł͂Ȃ��B�������A�]����LINQ�Ɠ������o�ŁA�������\�b�h�ŃR�[�h���������Ƃ��ł��邵�A�N�G���\�����g�����Ƃ��”\���i���̃R�[�h���Q�Ɓj�B

using System.Reactive.Linq;

// LINQ to Objects�ł̃N�G���̏�����
var ix = from x in Enumerable.Range(1, 10)
         where x % 2 == 0
         select x * x;

// Rx�ł̃N�G���̏�����
var rx = from x in Observable.Range(1, 10)
         where x % 2 == 0
         select x * x;
Imports System.Reactive.Linq

' LINQ to Objects�ł̃N�G���̏�����
Dim ix = From x In Enumerable.Range(1, 10)
         Where x Mod 2 = 0
         Select x * x

' Rx�ł̃N�G���̏�����
Dim rx = From x In Observable.Range(1, 10)
         Where x Mod 2 = 0
         Select x * x
LINQ to Objects��Reactive Extensions�œ����o�͌��ʂ�������N�G���\���̗�i��FC#�A���FVB�j

�@��葽���̂��Ƃ��������߁ARx�����ɗp�ӂ��ꂽ���\�b�h������������B�]���āA�K���������ׂē����Ƃ͂����Ȃ����A�]���A�g���Ă��郁�\�b�h�Ɠ������O�E�����Ӗ������‚��̂��������邱�Ƃɂ��A�V���Ȋw�K�R�X�g���}�����Ă���B

�@�܂������قȂ�C���^�[�t�F�C�X�ł���̂ɁA�����悤��LINQ�̉��Z�q��p���邱�Ƃ��ł��Ă���B���̂��Ƃ��”\�ɂ����̂́AIObservable<T>�^IObserver<T>�C���^�[�t�F�C�X�̐��藧�����̂��AIEnumerable<T>�^IEnumerator<T>�C���^�[�t�F�C�X�𔽓]�����č��ꂽ���̂����炾�B

�@�ȉ���IEnumerator<T>�C���^�[�t�F�C�X�𔽓]�������IObserver<T>�C���^�[�t�F�C�X������邱�Ƃ̏ؖ����L���iC#�̂݁BVisual Basic�͊����j�B

// �P��������IEnumerator<T>�C���^�[�t�F�C�X
public interface IEnumerator<T>
{
  T Current { get; }
  bool MoveNext();
  // void Reset(); Reset�͌��݁A�ʏ�g���Ă��Ȃ�
}
// MoveNext���\�b�h��bool�l�𕪉����ACurrent�v���p�e�B���W�񂷂�
public interface IEnumerator<T>
{
  // MoveNext���\�b�h�����������Ƃ���T�^�I�u�W�F�N�g��Ԃ�
  // ���s�����Ƃ��͂��������Ԃ��Ȃ��A�‚܂�void�ɂȂ�
  // �܂��A��O���������邱�Ƃ�����̂ŁA�߂�l��3���
  T|void|Exception GetNext(void);
}
// �����Ɩ߂�l�𔽓]������
// Pull�^�Ƃ��Ď��̒l��Get����A����
// Push�^�Ƃ��Ď��̒l��Got����A��
public interface IEnumeratorDual<T>
{
  void GotNext(T|void|Exception);
}
// 3��ނ̈����𕪂���
public interface IEnumeratorDual<T>
{
  void GotNext(T);
  void GotVoid(void); // void�𓾂�Ƃ����̂͊��������Ƃ�������
  void GotException(Exception);
}
// �����IObserver<T>�C���^�[�t�F�C�X�ƂȂ�
public interface IObserver<T>
{
  void OnNext(T value);
  void OnCompleted();
  void OnError(Exception error);
}
IEnumerator<T>�C���^�[�t�F�C�X����IObserver<T>�C���^�[�t�F�C�X�𓱏o�����iC#�j

�@�����ł͋L���Ȃ����AIEnumerable<T>�C���^�[�t�F�C�X�Ɋւ��Ă��A���l�̑�����s�����Ƃ�IObservable<T>�C���^�[�t�F�C�X������邱�Ƃ��m�F�”\���B�ȏ�̂��Ƃ́AIEnumerable<T>�C���^�[�t�F�C�X��IObservable<T>�C���^�[�t�F�C�X���A���̌����Ȃ��A���݂ɕϊ����邱�Ƃ��”\�ɂ��Ă���i���ہAIEnumerable<T>�C���^�[�t�F�C�X��ToObservable�g�����\�b�h�AIObservable<T>�C���^�[�t�F�C�X��ToEnumerable�g�����\�b�h��Rx���Q�Ƃ��邱�ƂŒlj������j�B

�@�Ȃ��A���̐}�Ɏ����Ƃ���AIEnumerable<T>��Pull�^�̃C���^�[�t�F�C�X�ł���AIObservable<T>��Push�^�̃C���^�[�t�F�C�X�ł���B

Pull�^��Push�^�̔�r
�}���́uSubscribe�v�i���T�u�X�N���C�u�j�Ƃ́APush�ʒm�̃I�u�U�[�o�i��IObserver<T>�I�u�W�F�N�g�j��o�^���邱�ƁB

�@Push�^�̏ꍇ�A�v���O�����͍ŏ���IObserver<T>�I�u�W�F�N�g��IObservable<T>�I�u�W�F�N�g�ɓo�^���i��Subscribe�j�A�ȍ~�͗��ҊԂŒl���`�B�����BPull�^�̏ꍇ�́A�v���O������IEnumerator<T>�I�u�W�F�N�g���擾���A�ȍ~�͂������Ĕ\���I�ɒl�����o���B

�@�����Ɋւ�������́A�u���W�FRoad to LINQ��pull�^��push�^�̐����v���Q�Ƃ��Ăق����B

���C�x���g�ɓK�p�����

�@�C�x���g�͂��܂��܂Ȍ`�Ō����BGUI�̃}�E�X�E�C�x���g�Ȃǂ����������AWindows Phone 7�ōl����̂Ȃ�W�F�X�`����Z���T�[����̃C�x���g���g�߂��낤�BINotifyPropertyChanged�C���^�[�t�F�C�X�ɂ��I�u�W�F�N�g���g�̒ʒm��f�[�^�o�C���h�Ȃǂ��������B

�@Rx�̓C�x���g�̍������”\�ɂ���B�Ⴆ�΃}�E�X�E�J�[�\���̃_�E���^���[�u�^�A�b�v�Ȃǂ̃C�x���g���������āA1�‚̃h���b�O���h���b�v�E�C�x���g�𐶐�����A�ȂǂƂ������Ƃ��”\�ɂȂ�B���̃R�[�h�́A���̗�ł���B

using System.Reactive.Linq;

// Windows�t�H�[����Form�N���X�Ńh���b�O�i���}�E�X�̍��{�^����
// �����Ȃ���ړ����Ă���ԁj�̍��W�C�x���g�𐶐�
var drag = from down in this.MouseDownAsObservable()
           from move in this.MouseMoveAsObservable().TakeUntil(this.MouseUpAsObservable())
           select new { move.X, move.Y };

// �C�x���g����IObservable<T>�I�u�W�F�N�g�ւ̕ϊ��R�[�h�𕪗�
// �Ȃ��A�����ł͊ȗ����̂��ߕ�����ɂ��C�x���g���̎w����s����
// ���A�����łȂ��`���ł��”\��
// ����FromEventPattern���\�b�h�Ɋւ��ẮA�ڂ����͈ȍ~�̘A�ڂʼn��
public static class FormExtensions
{
  public static IObservable<MouseEventArgs> MouseMoveAsObservable(this Form form)
  {
    return Observable.FromEventPattern<MouseEventArgs>(form, "MouseMove").Select(e => e.EventArgs);
  }

  public static IObservable<MouseEventArgs> MouseDownAsObservable(this Form form)
  {
    return Observable.FromEventPattern<MouseEventArgs>(form, "MouseDown").Select(e => e.EventArgs);
  }

  public static IObservable<MouseEventArgs> MouseUpAsObservable(this Form form)
  {
    return Observable.FromEventPattern<MouseEventArgs>(form, "MouseUp").Select(e => e.EventArgs);
  }
}
Imports System.Reactive.Linq

' Windows�t�H�[����Form�N���X�Ńh���b�O�i���}�E�X�̍��{�^����
' �����Ȃ���ړ����Ă���ԁj�̍��W�C�x���g�𐶐�
Dim drag = From down In Me.MouseDownAsObservable()
           From move In Me.MouseMoveAsObservable().TakeUntil(Me.MouseUpAsObservable())
           Select New With {move.X, move.Y}

' �C�x���g����IObservable<T>�I�u�W�F�N�g�ւ̕ϊ��R�[�h�𕪗�
' �Ȃ��A�����ł͊ȗ����̂��ߕ�����ɂ��C�x���g���̎w����s����
' ���A�����łȂ��`���ł��”\��
' ����FromEventPattern�Ɋւ��ẮA�ڂ����͈ȍ~�̘A�ڂʼn��
Public Module FormExtensions

  <System.Runtime.CompilerServices.Extension()>
  Public Function MouseMoveAsObservable(ByVal form As Form) As IObservable(Of MouseEventArgs)
    Return Observable.FromEventPattern(Of MouseEventArgs)(form, "MouseMove").Select(Function(e) e.EventArgs)
  End Function

  <System.Runtime.CompilerServices.Extension()>
  Public Function MouseDownAsObservable(ByVal form As Form) As IObservable(Of MouseEventArgs)
    Return Observable.FromEventPattern(Of MouseEventArgs)(form, "MouseDown").Select(Function(e) e.EventArgs)
  End Function

  <System.Runtime.CompilerServices.Extension()>
  Public Function MouseUpAsObservable(ByVal form As Form) As IObservable(Of MouseEventArgs)
    Return Observable.FromEventPattern(Of MouseEventArgs)(form, "MouseUp").Select(Function(e) e.EventArgs)
  End Function

End Module
3�‚̃C�x���g����������1�‚̃h���b�O�C�x���g�𐶐�����i��FC#�A���FVB�j

�@�܂��A���Ԃ��g�����l�̃t�B���^�����O���”\�ɂ���B���̃R�[�h��Windows�t�H�[���ł̗Ⴞ�B

// �iWindows�t�H�[����́jTextBox�R���g���[���ł���utextBox�v����
// TextChanged�C�x���g���擾
Observable.FromEventPattern<EventArgs>(textBox, "TextChanged")
  .Select(_ => textBox.Text)
  .Throttle(TimeSpan.FromSeconds(1)); // 1�b�ԑҋ@���ĕʂ̒l��
                                      // ���Ȃ���Η���
' �iWindows�t�H�[����́jTextBox�R���g���[���ł���utextBox�v����
' TextChanged�C�x���g���擾
Observable.FromEventPattern(Of EventArgs)(textBox, "TextChanged").
    Select(Function(sndr, ev) textBox.Text).
    Throttle(TimeSpan.FromSeconds(1)) ' 1�b�ԑҋ@���ĕʂ̒l��
                                      ' ���Ȃ���Η���
���Ԃ��g�����t�B���^�����O�i��FC#�A���FVB�j

�@�C���N�������^���E�T�[�`�ȂǁA���͂Ƀ��A���^�C���ɉ����ăl�b�g���[�N�ʐM�����悤�Ƃ���ꍇ�ȂǂɁA���ׂĂ̒l�ŒʐM�����悤�Ƃ���͖̂��ʂ��������낤�B���̏ꍇ�A�l��K�x�ɊԈ��������͂����B��L�̗�̓e�L�X�g�{�b�N�X�̓��͂ɕω����������ꍇ�A1�b�Ԃ̊Ԃ�TextChanged�C�x���g���������ĕʂ̒l��������O�̒l�𖳎�����悤�ȃt�B���^�����O������B�������邱�Ƃɂ��A���ʂȃl�b�g���[�N�ʐM��}������B

�@���̂悤�Ȏ��Ԃ��g��������́A�]���ł͂��Ȃ�̎�Ԃ������Ȃ���΋L�q�ł��Ȃ��������Ƃ����ARx�Ȃ�΂�������������͔��ɓ��ӂƂ���Ƃ���ŁA���\�b�h1�“K�p���邾���ōς�ł��܂��B

���񓯊������ɓK�p�����

�@Rx�͔񓯊������ɂ����đ傫�ȗ͂𔭊�����B�Ⴆ�΁iWPF�ŁjWebRequest�N���X�iSystem.Net���O��ԁj�Ŕ񓯊��ʐM���s���ꍇ���l���Ă݂悤�BBegin-End�ōs���񓯊������̓����_�����l�X�g���������B���̏ꍇ�A�����̃��N�G�X�g�������ȂǁA���G�ȏ���������̂�����A�܂��A��O�����͈̔͂ɒ��ӂ𕥂��K�v������A�l�X�g���������_�����ꂼ��ɓƗ�����try-catch���������K�v������BUI�X���b�h�ւ�BeginInvoke�i���񓯊��ł̏������s�̊J�n�˗��j�����Ȃ�̎�Ԃ��B

using System.Net;
using System.IO;

var req = WebRequest.Create("http://hoge/");
req.BeginGetResponse(ar =>
{
  try
  {
    var res = req.EndGetResponse(ar);
    var url = new StreamReader(res.GetResponseStream()).ReadToEnd();
    var req2 = WebRequest.Create(url); // �ŏ��̃��N�G�X�g�̌��ʂ����Ɏ��̃��N�G�X�g
    req2.BeginGetResponse(ar2 =>
    {
      try
      {
        var res2 = req2.EndGetResponse(ar2);
        var str = new StreamReader(res2.GetResponseStream()).ReadToEnd();
        Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(str)));
      }
      catch (WebException e) { Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(e.ToString()))); }
    }, null);
  }
  catch (WebException e)
  {
    Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(e.ToString())));
  }
}, null);
Imports System.Net
Imports System.IO

Dim req = WebRequest.Create("http://hoge/")
req.BeginGetResponse(
  Sub(ar)
    Try
      Dim res = req.EndGetResponse(ar)
      Dim url = New StreamReader(res.GetResponseStream()).ReadToEnd()
      Dim req2 = WebRequest.Create(url) ' �ŏ��̃��N�G�X�g�̌��ʂ����Ɏ��̃��N�G�X�g
      req2.BeginGetResponse(
        Sub(ar2)
          Try
            Dim res2 = req2.EndGetResponse(ar2)
            Dim str = New StreamReader(res2.GetResponseStream()).ReadToEnd()
            Dispatcher.BeginInvoke(New Action(Sub() MessageBox.Show(str)))
          Catch e As WebException
            Dispatcher.BeginInvoke(New Action(Sub() MessageBox.Show(e.ToString())))
          End Try
        End Sub, Nothing)
    Catch e As WebException
      Dispatcher.BeginInvoke(New Action(Sub() MessageBox.Show(e.ToString())))
    End Try
  End Sub, Nothing)
�ʏ�̔񓯊������R�[�h�i��FC#�A���FVB�j

�@Rx���g���ƁA���l�̃R�[�h�͈ȉ��̂悤�ɂȂ�B

WebRequest.Create("http://hoge/")
  .DownloadStringAsync()
  .SelectMany(url => WebRequest.Create(url).DownloadStringAsync())
  .ObserveOnDispatcher() // UI�X���b�h�֖߂�
  .Subscribe(
    str => MessageBox.Show(str), // �������̋���
    e => MessageBox.Show(e.ToString())); // ���s���̋���

public static class WebRequestExtensions
{
  // Rx���g���ƁA�g�����\�b�h�̌`�ŏ����𕪗����邱�Ƃ��ł���̂ŁA�{�̂����X�b�L��������
  public static IObservable<string> DownloadStringAsync(this WebRequest request)
  {
    return Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse, request.EndGetResponse)()
      .Select(res =>
      {
        using (var stream = res.GetResponseStream())
        using (var sr = new StreamReader(stream))
        {
          return sr.ReadToEnd();
        }
      });
  }
}
WebRequest.Create("http:'hoge/").
  DownloadStringAsync().
  SelectMany(Function(url As String) WebRequest.Create(url).DownloadStringAsync()).
  ObserveOnDispatcher().
  Subscribe(
    Sub(str)
      MessageBox.Show(str) ' �������̋���
    End Sub,
    Sub(e)
      MessageBox.Show(e.ToString()) ' ���s���̋���
    End Sub)

Public Module WebRequestExtensions

  ' Rx���g���ƁA�g�����\�b�h�̌`�ŏ����𕪗����邱�Ƃ��ł���̂ŁA�{�̂����X�b�L��������
  <System.Runtime.CompilerServices.Extension()>
  Public Function DownloadStringAsync(ByVal request As WebRequest) As IObservable(Of String)
    Return Observable.FromAsyncPattern(Of WebResponse)(AddressOf request.BeginGetResponse, AddressOf request.EndGetResponse)().
      Select(
        Function(res)
          Using stream = res.GetResponseStream()
            Using sr = New StreamReader(stream)
              Return sr.ReadToEnd()
            End Using
          End Using
          Return Nothing
        End Function)
  End Function

End Module
Rx��p�����񓯊������R�[�h�i��FC#�A���FVB�j

�@Rx���g�����ƂŃ����_���̃l�X�g�̓��\�b�h�E�`�F�[���ƂȂ�A�܂��A��O������UI�X���b�h�֖߂����Ƃ���ӏ��ɏW�񂳂�邱�ƂŁA�啝�ɋL�q�ʂ���������B

�@�g�����\�b�h�ɂ��ꕔ�̏������O�ɏo���Ă���̂ŁA���̕������A���t�F�A�Ɋ����邩������Ȃ����A���̂悤�ɊȒP�ɏ����ȕ��i�Ƃ��ĕ������邱�Ƃ��”\���Ƃ������Ƃ��ARx�̑傫�ȃ����b�g��1�‚��B

�@�Ƃ���ŁA�u���W:.NET�J���҂̂��߂̔񓯊������v�ŏЉ�ꂽ�悤�ɁAC# 5.0����񓯊������Ɋւ���\�����lj������B�ł́ARx���g���Ĕ񓯊������������̂͑҂������������̂��낤���H

�@�����͈Ⴄ�B�܂��ARx�͍������g����Z�p���B�����āARx��C# 5.0��async�\���Ŏg�����߂�Task<T>�I�u�W�F�N�g�ɕϊ����邱�Ƃ��܂��e�ՂȂ̂ŁA���������񓯊������͌����Ė��ʂɂȂ�Ȃ��B

�@�Ō�ɁARx��C# 5.0��async�\���́A������x�A�̈�͂��Ԃ邪�A�S���ʂ̉��l��񋟂���ʂ����Ȃ��Ȃ��̂ŁA������Rx���̂̉��l�͑��Ȃ��Ȃ��B

�@���̂��Ƃɂ‚��ďڂ����́A����ȍ~�̔񓯊������ɂ‚��Đ�������Ƃ��ɉ������B

�@�����Ď��̃y�[�W�ŁARx�̃C���X�g�[�����@��A�Z���u���̎�ނɂ‚��Đ�������B


�@INDEX
�@ �A�ځFReactive Extensions�iRx�j����
�@ ��1��@Reactive Extensions�̊T�v�Ɨ��p���@
  1�DRx�̗��j�^LINQ�ł���Ƃ������Ɓ^�C�x���g��񓯊������ɓK�p�����
�@   2�DRx�̃C���X�g�[�����@�^�A�Z���u���̎�ށ^���O��Ԃ̕���

CfbNXEy[Ww �@�u�A�ځFReactive Extensions�iRx�j����v


Insider.NET �t�H�[���� �V���L��
  • ��2��@�Ȍ��ȃR�[�f�B���O�̂��߂� �i2017/7/26�j
    �@�����_���ŋL�q�ł��郁���o�̑����Athrow���Aout�ϐ��A�^�v���ȂǁAC# 7�ɂ͈ȑO�����R�[�h���Ȍ��ɋL�q�ł���悤�ȋ@�\����������Ă���
  • ��1��@Visual Studio Code�f�o�b�O�̊�b�m�� �i2017/7/21�j
    �@Node.js�v���O�������f�o�b�O���Ȃ���AVisual Studio Code�ɓ�������Ă���f�o�b�O�@�\�̊�{�́u�L�v���}�X�^�[���悤
  • ��1��@���ĂȃR�[�f�B���O�̂��߂� �i2017/7/19�j
    �@C# 7�Œlj����ꂽ�V�@�\�̒�����A�u���l���e�����\���̉��P�v�Ɓu���[�J���֐��v���Љ��B�����͕�����₷���R�[�h���L�q����̂Ɏg����
  • Presentation Translator �i2017/7/18�j
    �@Presentation Translator��PowerPoint�p�̃A�h�C���B�v���[���e�[�V�������̎����̕t����A������ł̎��^�����A�X���C�h�̖|����s����
��IT���[���}�K�W���@�V������X�^�b�t�̃R���������[���œ͂��܂��i�����j

���ڂ̃e�[�}

Insider.NET �L�������L���O

�{�� ����