使用信号量实现条件变量过程中的一些坑

https://birrell.org/andrew/papers/ImplementingCVs.pdf

另外,C#的Monitor.WaitMonitor.Pulse看起来可以用来实现CV。在这篇文章中提到了一些使用细节。看起来和pthread_cond_wait() 的用法有点类似,都要在函数返回后重新确认producer有没有产生需要的内容,然后在必要时继续等待。

值得一提的是,在第二篇文章中,作者实际上构造出了一个简易的AutoResetEvent 。

尝试了一下Bot Framework

方才刷了一波MS信仰。明天可以看看自然语言处理工具包。

GitHub:https://github.com/CXuesong/HalfMoon.Endpoint

试用体验:https://github.com/CXuesong/HalfMoon.Endpoint/wiki/%E8%AF%95%E7%94%A8%E4%BD%93%E9%AA%8C

另外,由于目前BotBuilder暂时仅支持.NET Framework 4.6,因此无法将其配合.NET Core使用,也就无法在除Windows以外的系统上运行了。不过,根据#2346的情况,说不定过几天我们就可以将机器人移植到ASP.NET Core上了。 Continue reading “尝试了一下Bot Framework”

AsyncEnumerable 随笔

AsyncEnumerable 主要是伴随着对异步迭代器的需求而产生的。之前在编写WikiClientLibrary的时候,遇到了一个和分页相关的问题。比如我们要从维基服务器获取所有页面的列表。一个最简单、使用异步的想法如下所示

public async Task<IEnumerable<Page>> FetchAllPagesAsync(Site site)
{
    JToken json = await site.SendReuestAsync(/* ... */);    // 向服务器请求所有页面
    IList<Page> result = PagesFromJson();                   // 将获取到的JSON转换为页面列表
    return result;
}

这样,客户程序可以使用循环或者LINQ来使用这些条目序列。

但情况没有这么简单。服务器在一次请求中最多只能返回500条结果,那么对于大部分的维基而言,我们可能需要多次请求才能获取到所有的结果。那么,我们要怎么处理这种情况呢?

Continue reading “AsyncEnumerable 随笔”

如何在PowerPoint中取消选择选区中的文本框

Sub UnselectTextBoxes()
Dim c As New Collection
For Each s In ActiveWindow.Selection.ShapeRange
    If s.TextFrame.HasText <> msoTrue Then
        c.Add s
    End If
Next
ActiveWindow.Selection.Unselect
For Each s In c
    s.Select MsoTriState.msoFalse
Next
End Sub

 

Content is available under CC BY-SA 3.0 unless otherwise noted.