小编Jes*_*ter的帖子

F#async或C#async/await如何真正起作用

F#async或C#的async/await关键字实际上如何运作?

我们以MailboxProcessor为例:

type Agent<'T> = MailboxProcessor<'T>
let agent = Agent.Start(fun inbox ->
    let rec loop() = async {
        let! msg = inbox.Receive()
        // do something with each message as it arrives
    }
Run Code Online (Sandbox Code Playgroud)

基于我对F#异步模式的理解,我知道该let!关键字将阻止此行中异步工作流内的代码执行,直到项目在收件箱中可用.

我也知道这个"阻塞"是在没有真正阻塞线程的情况下完成的.

async/await在C#中查看新模式时,完全相同的事情适用于此.当我在await异步方法中使用关键字时,该方法的执行可以在该行"阻塞",并且只允许方法调用"唤醒"并在基础等待任务完成时稍后完成工作.

我想要的是一个关于F#/ C#如何设法"无阻塞地等待"的"执行摘要".

.net c# f# async-await

6
推荐指数
0
解决办法
497
查看次数

带保存点的延迟约束触发器

我们在应用程序中使用了一些延迟约束触发器,我希望使用 pgTap 为它们编写一些测试。对于数据库测试,我们喜欢将事物包装在事务内,以便最终将所有内容隔离并清理,但这给延迟约束触发器带来了问题,因为除非提交事务(按设计),否则它们似乎不会触发)。

有什么办法让他们使用保存点来开火吗?我尝试了如下简单的操作,但除非我提交外部事务,否则延迟触发器似乎仍然不会触发。

BEGIN TRANSACTION;

CREATE TABLE test_table_with_trigger
(
    comment text
);

CREATE FUNCTION t_fn_test() RETURNS TRIGGER AS
$$
BEGIN
    RAISE INFO '%', tg_argv;
    RETURN NEW;
END;
$$
    LANGUAGE plpgsql VOLATILE;

CREATE CONSTRAINT TRIGGER t_test_constraint
    AFTER INSERT
    ON test_table_with_trigger DEFERRABLE INITIALLY IMMEDIATE
    FOR EACH ROW
EXECUTE PROCEDURE t_fn_test('constraint trigger');

CREATE TRIGGER t_test
    AFTER INSERT
    ON test_table_with_trigger
    FOR EACH ROW
EXECUTE PROCEDURE t_fn_test('row trigger');

SAVEPOINT nested;

INSERT INTO test_table_with_trigger (comment) VALUES ('will it trigger?');

RELEASE SAVEPOINT nested;

ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

postgresql

4
推荐指数
1
解决办法
272
查看次数

无法使用URL导航到ui-router状态

我正在使用ui-router进行简单的角度应用.我有几种状态可以选择然后编辑有关发布者的信息.相关配置:

            .state('select-publisher', {
                url: '/select-publisher',
                templateUrl: '/Content/superadmin/src/templates/publishers/publishers.html'
            })

            .state('publisher', {
                abstract: true,
                url: 'publisher/{id:int}',
                templateUrl: '/Content/superadmin/src/templates/publishers/publisher.html'
            })
            .state('publisher.details', {
                url: '/details',
                templateUrl: '/Content/superadmin/src/templates/publishers/details.html'
            })
            .state('publisher.ad-tags', {
                url: '/ad-tags',
                templateUrl: '/Content/superadmin/src/templates/publishers/ad-tags.html'
            })
            .state('publisher.native-ads', {
                url: '/native-ads',
                templateUrl: '/Content/superadmin/src/templates/publishers/native-ads.html'
            })
Run Code Online (Sandbox Code Playgroud)

在select-publisher状态中,我有一个很大的可用发布者列表.它们中的每一个都绑定到ng-click事件,该事件在我的控制器中触发以下功能:

 $scope.selectPublisher = function(publisher) {
     publisherService.setSelectedPublisher(publisher);
     $state.go('publisher.details', {id: publisher.Id});
 };
Run Code Online (Sandbox Code Playgroud)

这很好用,并将我带到publisher.details状态并呈现正确的视图.此时,浏览器中的URL指向localhost:1337/superadmin#/publisher/39/details39,即我选择的发布者的ID.

问题是,如果我刷新此页面或尝试通过将URL从应用程序的其他区域粘贴到浏览器中直接导航到该页面,我总是被带回select-publisher状态.我希望能够配置我的状态,以便我能够基于URL导航到详细状态(或任何其他状态).

值得注意的是,我确实在所有状态之后都定义了捕获所有路径:

$urlRouterProvider.otherwise('/select-publisher');
Run Code Online (Sandbox Code Playgroud)

我假设由于某种原因这是触发但我无法推断为什么导航在我的应用程序中使用,$state.go如我在控制器中指示以及ui-sref directive在我的HTML模板中使用但不通过直接导航到URL.

javascript angularjs angular-ui-router

3
推荐指数
1
解决办法
3730
查看次数

这个语法是什么 isNaN(+str!)

在这里找到的

export function convertToUnit (str: string | number | null | undefined, unit = 'px'): string | undefined {
  if (str == null || str === '') {
    return undefined
  } else if (isNaN(+str!)) { // **** THIS LINE ****
    return String(str)
  } else {
    return `${Number(str)}${unit}`
  }
}
Run Code Online (Sandbox Code Playgroud)

javascript typescript

3
推荐指数
1
解决办法
328
查看次数

具有不能显式取消定义的可选属性的类型

我正在研究以下类型定义:

type NumericKeys<T> = {
    [K in keyof T]: T[K] extends number ? K : never
}[keyof T]

type Update<T extends Record<string, any>> = {
    $set?: {
        [K in keyof T]?: T[K]
    },
    $inc?: Partial<Pick<T, NumericKeys<T>>>
}
Run Code Online (Sandbox Code Playgroud)

事情与我想要的方式非常接近,除了在 和 的情况下$set$inc这些类型允许用户为任何嵌套属性提供显式的未定义值。理想情况下,两个对象中的所有属性都是可选的,但如果用户提供它们,它们必须与原始对象中相应属性的类型相匹配。

type Item = {
    name: string;
    description: string;
    count: number
}

const example: Update<Item> = {
  $set: {
     // Ideally this would throw a type error because it should be type string
     name: undefined …
Run Code Online (Sandbox Code Playgroud)

typescript

3
推荐指数
1
解决办法
1314
查看次数

std :: mutex和condition_variable无法访问类中的私有成员

我已经做了一些谷歌搜索并看到关于这个问题的堆栈溢出的类似问题,但我很难理解处理它的原因/解决方案.鉴于在ThreadPool.hpp中声明的以下类,我收到以下2个错误:

错误1错误C2248:'std :: mutex :: mutex':无法访问类'std :: mutex'中声明的私有成员c:\ users\jesse\documents\school\summer semester 2012\concurrent processing\project 2\ultra_grep v2\ultra_grep\threadpool.hpp 39 1 ultra_grep2

错误2错误C2248:'std :: condition_variable :: condition_variable':无法访问在类'std :: condition_variable'中声明的私有成员c:\ users\jesse\documents\school\summer semester 2012\concurrent processing\project 2\ultra_grep v2\ultra_grep\threadpool.hpp 39 1 ultra_grep2

class ThreadPool
{
private:
std::queue<std::string> _consoleTasks;
std::queue<std::tr2::sys::path> _tasks;
std::map<std::string, std::vector<GrepMatch>> _grepMatches;
int _nThreads, _fileMatches, _totalMatches, _workingThreads;
std::vector<thread> _threads;
Arguments _args;
std::mutex _taskMutex, _wakeMutex, _consoleMutex, _threadCountMutex;
std::condition_variable _wakeCondition;

public:
ThreadPool( int threads, Arguments args );
~ThreadPool() {};
void GrepFunc();
void ConsoleFunc();
void SearchFile( std::string );
void SearchFileVerbose( std::string …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutex

2
推荐指数
1
解决办法
3992
查看次数

确保主线程等待所有任务完成

我正在编写一个C#控制台应用程序,并且在所有生成的关闭任务都有机会完成之前,主要线程关闭了.一般程序流程如下所示:

该程序将目录的路径作为命令行参数.然后,它遍历该目录中与特定扩展名匹配的每个文件,并为每个匹配的文件生成一个新任务,以打开并分析该文件:

Directory.GetFiles(directoryPath).ToList<string>().Where(x => Path.GetExtension(x) == ".xfast").ToList().ForEach(x => ProcessXFastFile(x));
Run Code Online (Sandbox Code Playgroud)

这些文件中的每一个都包含大量CSV值,这些值对应于唯一的产品密钥.例如,一个文件可能包含100万个CSV行和400个唯一的产品密钥.程序的要点是根据产品密钥对所有行进行排序,并根据密钥将其写回各个文件.

因此,在ProcessXFastFile方法中,我Dictionary<string, List<string>>使用产品代码作为Key值创建,并将与该键匹配的每个CSV行添加到相应的列表中.

排序完成后,我遍历字典并为每个Key值生成一个新任务,并在该List中写出CSV行:

foreach (KeyValuePair<string, List<string>> entry in productDictionary) {
    string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour, entry.Key);
    List<string> quotes = entry.Value;
    Task writeFileTask = Task.Factory.StartNew(() => WriteProductFile(writePath, quotes));
}
Run Code Online (Sandbox Code Playgroud)

问题是主要线程在这些任务到WriteProductFile的每一个都有机会完成写出数据之前就结束了.例如,我使用一个文件作为控制测试,并且知道字典中有~450个唯一键,因此应该写出许多相应的文件.但是,在程序结束之前,只有大约10个文件有机会写出来.

如何确保我的程序保持足够长的时间以完成所有任务?任何帮助表示赞赏.

c# multithreading task task-parallel-library

2
推荐指数
1
解决办法
285
查看次数

确定表中输入的行索引和列索引

我正在致力于创建一个基于 javascript 的电子表格应用程序。现在,我可以动态地将电子表格创建为一个表格,其中包含提供的行数和列数以及每个单元格中的文本输入,如下所示。

我希望有一个与表中的所有输入相关联的通用事件,在其中我能够确定触发该事件的输入的行索引和列索引。像这样的东西:

$('.spreadsheet-cell').click(function () {
     var rowIndex = $(this).attr('rowIndex');
     var columnIndex = $(this).attr('columnIndex');
});
Run Code Online (Sandbox Code Playgroud)

我最初尝试通过在创建 html 输入元素时动态添加行和列索引属性来实现,但是当我在创建原始电子表格后添加行或列时,尝试移动这些属性的值会变得混乱。我想我可以让这个方法工作,如果它归结为它,但它看起来很混乱,当我认为可能有某种方法使用 jQuery 来确定 DOM 的相对索引时,我不想对 DOM 搞得那么混乱。父<td><tr>.

javascript jquery

2
推荐指数
1
解决办法
3680
查看次数

具有多个子级的通用基类

我目前有一个小的对象层次结构,如下所示:

public class BaseClass {
    // this class is empty and exists only so the others can extend it and share the
    // same base type
}

public class ChildA : BaseClass {
    public Subject<AssociatedClassA> Results;
}

public class ChildB : BaseClass {
    public Subject<AssociatedClassB> Results;
}
Run Code Online (Sandbox Code Playgroud)

在我的设计中,我想强制执行从每个扩展的类BaseClass应该包含一个Subject<SomeType>被调用的Results.我想知道是否有一种方法可以将Results移动到基类或接口中,以便我可以为Subject构造基类时提供泛型类型.例如,如果我可以这样做,那将是非常棒的:

ChildA<AssociatedClassA> instance = new ChildA<AssociatedClassA>();
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,因为实际上只有一个模板参数与ChildA匹配,如果我构建它时可以为我处理:

ChildA instance = new ChildA();
// Results is automatically set to Subject<AssociatedClassA>
Run Code Online (Sandbox Code Playgroud)

我现在卡住了尝试实现这一点,好像我试图将结果移动到基类中,主题需要一个我无法提供的模板参数.可能有超过2个派生类,我不喜欢扩展此系统的人必须知道手动将结果添加到每个子类的想法.

根据下面2个答案的建议,这解决了我将结果移动到基类的愿望,但是我遇到了另一个问题,因为我希望能够使用BaseClass作为方法的泛型参数,这样任何一个可以使用派生类.例如:

 public void ProcessBaseClass(BaseClass base) …
Run Code Online (Sandbox Code Playgroud)

c# generics polymorphism

2
推荐指数
1
解决办法
312
查看次数

顺序"逆向工程"的模式

想知道是否有任何已建立的模式可用于支持此功能的核心或第三方库中的此功能甚至功能?

我使用seq表达式编写了一个复杂的序列,该表达式采用开始时间和规则列表,规定何时允许在时间线上发生某些事件以创建无限序列.它很容易提供任何起始值,DateTime并开始向前迈进.结果序列是seq,<DateTime>对应于带时间戳的事件.

我想做的是能够倒退这个事件的理论时间表.我想能够说"返回十步并给我DateTime",以便我知道我是否将结果应用于原始序列作为输入我最终会回到我开始的地方.

我是否必须扭转复杂的逻辑才能使其发挥作用?或者是否有一种方法可以有效地"强制"我的前向逻辑,这样我就可以继续提供输入,直到我得到的结果正确地给我10步直到指定的DateTime?

我意识到我在解释这个问题方面做得不好,所以可能是一个简化的例子来帮助我看到我所追求的东西.假设我使用一些逻辑模式生成了一系列int.让我们说2的倍数来保持简单:

let seq = [ 2; 4; 6; 8; 10; 12; 14; 16; 18; 20; ]
Run Code Online (Sandbox Code Playgroud)

(虽然使用我的预定义逻辑,它是一个延迟生成的序列)

我可以很容易地从它里面的任何值开始生成这个序列,所以给定12我可以继续前进

let seqFrom12 = [ 12; 14; 16; 18; 20; ]
Run Code Online (Sandbox Code Playgroud)

我希望能够为序列的任何可能值计算我需要提供的值,以便X步骤将我带到序列中的另一个值.

所以我想要序列的所有值,以便X = 3多步将我带到序列中的值12.所以我需要重新计算到10,然后是8,然后是6.仅在实际情况下,应用反向逻辑要困难得多

ienumerable f# sequence

2
推荐指数
1
解决办法
425
查看次数

在 APIConnect 中设置身份验证标头

我正在尝试 APIConnect,并希望能够调用 OpenWhisk 操作。据我所知,为了做到这一点,我需要使用我的令牌设置授权标头。我在调用和代理策略下看到的唯一选项是使用基本身份验证。

不管 OpenWhisk 是什么,为了让 APIConnect 成为我可用的产品,我需要能够设置标头。

openwhisk apiconnect ibm-cloud

2
推荐指数
1
解决办法
3085
查看次数

ASP.Net MVC3缺少模型属性

我是MVC3的新手,我正在尝试编写博客应用程序作为学习工具.

我已经为博客文章创建了一个数据库对象,并使用带有读/写操作的Controller和使用Entity Framework控制实体的视图生成了一个控制器.

我遇到了编辑命令的麻烦.博客文章大约有6个属性,但我只想允许编辑修改帖子的标题和内容.我的代码如下:

public ActionResult Edit(int id)
    {
        blog_Post blog_post = db.blog_Post.Find(id);
        return View(blog_post);
    }

    //
    // POST: /Post/Edit/5

    [HttpPost]
    public ActionResult Edit(blog_Post blog_post)
    {
        if (ModelState.IsValid)
        {
            db.Entry(blog_post).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(blog_post);
    }

@model BlogVersion1._0.blog_Post

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>blog_Post</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Title)
        @Html.ValidationMessageFor(model => model.Title)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.PostContent)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.PostContent)
        @Html.ValidationMessageFor(model …
Run Code Online (Sandbox Code Playgroud)

c# sql-server entity-framework asp.net-mvc-3

0
推荐指数
1
解决办法
4178
查看次数

在另一个任务中等待任务

我正在开发一个C#控制台应用程序,它将负责运行一系列任务.其基本结构如下:

var tasks = workItems.Select(x => Task.Factory.StartNew(() =>
{
    DoSomeWork(x);
})).ToArray();

Task.WaitAll(tasks);
Run Code Online (Sandbox Code Playgroud)

问题是DoSomeWork()是一个异步方法,等待另一个任务的结果,它还需要等待对Facebook API的调用. http://facebooksdk.net/docs/reference/SDK/Facebook.FacebookClient.html#GetTaskAsync(string)

public async void DoSomeWork(WorkItem item)
{
    var results = await GetWorkData();
}

public async Task<List<WorkData>> GetWorkData()
{
    var fbClient = new FacebookClient();
    var task = fbClient.GetTaskAsync("something");
    var fbResults = await task;
};
Run Code Online (Sandbox Code Playgroud)

我以为我能够通过调用Task.WaitAll()来支持这种嵌套任务的概念,但父任务的执行几乎立即完成.在应用程序的末尾放置一个Console.ReadLine()以防止它提前执行,这表明结果确实会在稍后从Facebook返回.

我是否遗漏了一些明显的东西,或者是否有更好的方法来阻止我的任务集合,这将允许这种情况?

c# task-parallel-library async-await

0
推荐指数
1
解决办法
2337
查看次数